Git 實用基礎(配置,建庫,推送 GitHub)


Git 實用基礎(配置,建庫,提交,推送 GitHub)

SVN ? Git ?

目前市面上主流的版本控制系統就是 SVN 和 Git 。

兩者的區別簡單通俗地說就是,版本數據是否有在本地。

如果覺得不夠簡單通俗,直接上圖:

這是 SVN ,顯然是一種集中式的版本控制系統,主要的版本數據全部保存在服務器。

  • 本地用戶只有自己以前同步過的版本,如果不聯網,用戶是看不到未同步過的歷史版本的。
  • 提交需要連接服務器(非本地版本庫),也需要寫權限。
  • 管理員靈活可以掌控開發人員的讀、寫、修改目錄等權限。
  • 提交並非每次都會成功,因為你的同事可能比你早提交,那么會提示“改動基於過時的版本,先更新再提交”… 諸如此類,你基於以前版本修改得到的新版本就無法提交(干活不快不行的啊)。
  • 當提交的慢時,又同時對同一文件進行操作時,就會出現沖突,沖突解決是一個提交速度的競賽:手快者,先提交,平安無事;手慢者,后提交,可能遇到麻煩的沖突解決。
  • 因為工作時很多時刻都要跟服務器進行同步或者解決沖突,這樣每個參與開發的人員都可以看到團隊的人員做了些什么工作。你提交的慢,提交失敗的時候,再去同步下來的代碼,或者解決沖突時,你可以看到你的同事新做了哪些工作。
  • 一個致命的缺陷:一旦中央服務器有宕機等故障,全員無(dai)法(xin)工(xiu)作(jia),所有人都無法提交,同步,個人修改了代碼也只是在個人本地上,如果服務器無法使用時間過長,開發人員此前還一直在進行修改相同文件的工作,等服務器好了,就是提交速度的比拼,求最后提交的社畜的心理陰影面積。

經過上面的描述,可以知道, SVN 的本質就是,只關心文件的具體內容差異,那些文件做了更新,做了哪些更新。


Git ,就是針對 SVN 的以上這一致命缺陷,做出了它的特色。

Git 更多的只關心文件數據的整體是否發生變化。Git 不保存文件內容前后變化的差異數據。

實際上,Git 更像是把變化的文件作快照后,記錄在一個微型的文件系統中。每次提交更新時,它會縱覽一遍所有文件的指紋信息並對文件作一快照,然后保存一個指向這次快照的索引。為提高性能,若文件沒有變化,Git 不會再次保存,而只對上次保存的快照作一連接。

在分布式版本控制系統中,客戶端並不只提取最新版本的文件快照,而是把原始的代碼倉庫完整地鏡像下來。這么一來,任何一處協同工作用的服務器發生故障,事后都可以用任何一個鏡像出來的本地倉庫恢復。這類系統都可以指定和若干不同的遠端代碼倉庫進行交互。籍此,你就可以在同一個項目中,分別和不同工作小組的人相互協作。你可以根據需要設定不同的協作流程。

另外,因為Git在本地磁盤上就保存着所有有關當前項目的歷史更新,並且Git中的絕大多數操作都只需要訪問本地文件和資源,不用連網,所以處理起來速度飛快。用SVN的話,沒有網絡或者斷開VPN你就無法做任何事情。但用Git的話,就算你在飛機或者火車上,都可以非常愉快地頻繁提交更新,等到了有網絡的時候再上傳到遠程的鏡像倉庫。換作其他版本控制系統,這么做幾乎不可能,抑或是非常麻煩。

  • Git中每個克隆(clone)的版本庫都是平等的。你可以從任意一版本庫的克隆來創建屬於你自己的版本庫,同時你的版本庫也可以作為源提供給他人,只要你願意。在 GitHub 上也是如此。
  • Git的每一次提取操作,實際上都是一次對代碼倉庫的完整備份。
  • 提交完全在本地完成,無須別人給你授權,你的版本庫你作主,並且提交總是會成功。在你的本地版本庫,是不存在沖突這一說法的,只有舊版本和新版本的更新問題。甚至基於舊版本的改動也可以成功提交,提交會基於舊的版本創建一個新的分支。
  • PUSH 給他人或者他人 PULL 你的版本庫,合並會發生在 PULL 和 PUSH 過程中,不能自動解決的沖突會提示手工完成。沖突解決不再像是SVN一樣的提交競賽,而是在需要的時候才進行合並和沖突解決。
  • Git 可以模擬集中式的工作模式,Git版本庫也是統一放在服務器中的。
  • Git 版本庫可以為開發人員進行授權:創建版本庫,向版本庫 PUSH,夠讀取(克隆)版本庫的權限,像 GitHub 上就有 private 私有庫,對外不可見,只有自己擁有對於該庫的所有權限。
  • 開發人員先將服務器的版本庫克隆到本地;並經常的從服務器的版本庫拉(PULL)最新的更新;完成工作后,將自己的改動推(PUSH)到服務器的版本庫中,當其他人和版本庫同步(PULL)時,會自動獲取到更新。
  • 開發人員在脫離 Git 服務器所在網絡的情況下,如移動辦公/出差時,可以照常使用代碼庫;只需要在能夠接入Git服務器所在網絡時, PULL 和 PUSH 即可完成和服務器同步以及提交。
  • Git提供 rebase 命令,可以讓你的改動看起來是基於最新的代碼實現的改動。
  • Git 有更多的工作模式可以選擇,這也是 Git 成為當下最流行的版本控制系統的原因。

具體更多差異可以參考 SVN與Git比較的優缺點差異

Git !Git 配置

查看配置

$ git config -l

所有相關配置都可以在此查看:

image-20200910150217250

查看不同級別的配置:

# 查看系統級別的配置文件
$ git config --system --list
# 查看當前用戶的配置文件
$ git config --global --list

其中系統級別的配置文件在 Git\etc\gitconfig :Git 安裝目錄下的 gitconfig 文件下:

image-20200910150842786

當前用戶級別的配置文件在 C:\Users\Administrator\ .gitconfig ,只適用於當前登錄用戶的配置:

image-20200910151222521

配置當前用戶

# 名稱
$ git config --global user.name "l1ng14"  
#郵箱
$ git config --global user.email l1ng14@foxmail.com

配置用戶表示是十分必要的

當你安裝Git后首先要做的事情是設置你的用戶名稱和e-mail地址。這是非常重要的,因為每次Git提交都會使用該信息。它被永遠的嵌入到了你的提交中.

只需要做一次這個設置,如果你傳遞了--global 選項,因為Git將總是會使用該信息來處理你在系統中所做的一切操作。如果你希望在一個特定的項目中使用不同的名稱或e-mail地址,你可以在該項目中運行該命令而不要--global選項。總之--global為全局配置,不加為某個項目的特定配置。

Git 工作流程

總的來說,Git 分為四個工作區域:

bg2015120901

  • Working Directory :工作區,本地項目工程所在的區域。
  • Stage ( Index ) :暫存區,有臨時改動可以通過一下命令保存到暫存區:
# add . :表示將工作區的所有文件都保存到暫存區
$ git add .
  • Repository(Local Repository ) :倉庫區(本地倉庫),安全存放版本數據的地方,這里保存有提交過的版本數據,其中 Head 只想最新提交到本地倉庫的版本。
    • 本地倉庫有兩種方法進行創建:
  1. 創建全新的本地倉庫

在需要用 Git 管理的項目的根目錄下,使用 Git Bash 命令行執行操作:

$ git init
  1. 克隆遠程倉庫

克隆遠程服務器的倉庫到本地, 相當於將遠程服務器上的倉庫完全鏡像一份到本地,可以使 gitee 或者 github 上的倉庫。

在適合的文件夾下,使用 Git Bash 命令行執行操作:

$ git clone https://github.com/L1ng14/Hello-World.git

提交需要使用以下命令:

# 提交到本地倉庫
$ git commit -m "提交信息"
  • Remote (Remote Repository ) :遠程倉庫,在進行托管的服務器上,工作上的改動通常需要進行提交到遠程倉庫中,和他人進行協同開發。通常要進行
# 拉取項目到本地倉庫
$ git pull
# 推送項目到遠程倉庫
$ git push

使用 GitHub 遠程倉庫

  1. 首先在本地生成 SSH 密鑰。在 C:\Users\Administrator\.ssh 目錄下
$ ssh-keygen -t rsa

rsa : 使用rsa算法進行加密,執行后,會在/home/當前用戶/.ssh目錄下找到id_rsa(私鑰)和id_rsa.pub(公鑰)

fdipzone@ubuntu:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/Administrator/.ssh/id_rsa): 這里輸入要生成的文件名
Enter passphrase (empty for no passphrase):                       這里輸入密碼 
Enter same passphrase again:                                      這里重復輸入密碼
Your identification has been saved in /c/Users/Administrator/.ssh/id_rsa.
Your public key has been saved in /c/Users/Administrator/.ssh/id_rsa.pub.
The key fingerprint is:
f2:76:c3:6b:26:10:14:fc:43:e0:0c:4xxxxxxxxxxxxxxxxxxxxxxxx
The key's randomart image is:
+--[ RSA 2048]----+
|    .+=*..       |
|  .  += +        |
|   o oo+         |
|  E . . o        |
|      ..S.       |
|      .o .       |
|       .o +      |
|       ...oo     |
|         +.      |

image-20200910152507922

  1. 添加密鑰到 GitHub 賬號中:

image-20200910152103613

  1. 在 GitHub 上新建遠程倉庫

    image-20200910153827824

    相關配置根據自己的喜好設定好。

  2. 拉取遠程倉庫的鏡像到本地

image-20200910153716157

在自建的遠程倉庫的中復制得到該倉庫的 URL。在適合的文件夾下,使用 Git Bash 命令行執行操作:

$ git clone https://github.com/L1ng14/Hello-World.git

拉取成功后,在倉庫文件夾下會出現:

image-20200910154129048

結合 IDEA 提交到 GitHub

新建項目綁定 Git

需要 push 目標工程到 GitHub 上的目標遠程倉庫:

1.已經在 GitHub 建好倉庫

這里也介紹兩種方法:

1.1 文件復制
$ git clone "倉庫的 URL"

image-20200910154129048

直接選取全部文件復制到目標工程的目錄下

回到 IDEA 打開工程,工程上會出現:

image-20200910164137893

這時候可以使用前面介紹到的命令進行添加,提交,推送

# 添加到暫存區
$ git add .
# 提交到本地倉庫
$ git commit -m "提交信息"
# 推送到遠程倉庫
$ git push

之后刷新遠程倉庫(GitHub 倉庫頁面),就可以看到目標項目已經提交到遠程倉庫中。


2. GitHub 上沒建倉庫

用圖形界面操作:

用 IDEA 打開目標項目,先在本地建立一個本地倉庫,有利於后面進行添加,提交操作

image-20200910210230264

同上命令進行添加,提交。別忘了排除文件

排除文件

在項目根目錄下,文件 .gitignore 用於排除不需要進行版本控制的文件。

HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/

#自定義排除
/.mvn/
mvnw
mvnw.cmd

### VS Code ###
.vscode/

排除的文件在 IDEA 中會變灰色。

image-20200910163204262

點擊分享項目到 GitHub。

image-20200910203218858

填寫相關信息:

image-20200910205908774

點擊 Share ,GitHub 會自動建立一個遠程倉庫,並首次推送目標項目。

相關問題解決方案

Updates were rejected because the remote contains work that you do not have locally.

具體提示:Updates were rejected because the remote contains work that you do not have locally. This is usually caused by another repository pushing to the same ref. You may want to first integrate the remote changes (e.g., 'git pull ...') before pushing again. See the 'Note about fast-forwards' in 'git push --help' for details.

image-20200910125503853

問題原因: 本地基於的修改版本不是遠程倉庫的源版本,需要先 pull 下來遠程倉庫的源版本。

$ git pull origin master

image-20200910130713671

這時候,本地和遠程倉庫的頭版本就保持一致了,同時此前本地的修改還保留在本地,這時候,在 push 就應該沒問題了。

$ git push

image-20200910130656192

刪除已提交的忽略文件

如果一次提交后,忘記配置忽略文件夾或者文件,導致需要忽略的文件被提交到遠程倉庫中,如 Github 上。

因為 Github 上是不支持刪除文件夾或者文件的,這時候即使,后面面配置了忽略該文件夾或者文件,遠程倉庫中依然會保有該文件夾或者文件。

以 .idea 文件夾為例,這時候需要用到命令:

$ git rm -r --cached .idea

--cached :只刪除遠程倉庫中的對應文件夾或者文件。

push 之前別忘了提交:

$ git commit -m "提交信息"
$ git push

不用擔心誤刪的情況發生,執行命令后,會有一系列提示,remove 或者刪除了哪些文件夾、文件。

強行覆蓋已有倉庫

# 強制提交到遠程倉庫,會強制覆蓋
$ git push git@github.com:L1ng14/test.git master -f

image-202009102215042

別忘了這樣做的重要前提:已經在 GitHub 建好一個遠程倉庫,並且你已經決定覆蓋它

cannot load information for github.com

image-20200911143658652

通過圖形界面分享工程到 GitHub 的時候會出現以上錯誤,可以通過增大超時時間進行解決;

image-20200911143839562

但是畢竟有 qiang。增大后有時候還是會超時,建議還是先在 GitHub 建好庫。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM