1. 程式人生 > >Windows下 Git 常用操作記錄

Windows下 Git 常用操作記錄

1、windows客戶端安裝

下載地址:http://msysgit.github.io/
全部預設安裝即可。
安裝完成後,會在系統右鍵選單中整合Git Bash Here等選單選項,說明安裝成功。

2、配置git使用者名稱及郵箱地址

這個就相當於一個使用者的標識資訊,表示建立倉庫的所有者資訊。

git config --global user.name "Your Name"
git config --global user.email "[email protected]"

3、建立版本庫

新建一個空目錄作為你的倉庫。比如:gitwork
在目錄中右鍵選擇Git Bash Here

,輸入git init,初始化當前目錄作為你的倉庫。

$ git init
Initialized empty Git repository in F:/gitwork/.git/

操作完成後,會在當前目錄下建立一個.git的資料夾,預設是隱藏的,不要手動操作這個目錄下的任何檔案,它是git用來跟蹤版本庫的。

3.1、 新增檔案到版本庫

使用git add readme.txt將工作區的檔案readme.txt(檔案必須存在)新增到暫存區(staged狀態,commit前必須的操作,否則無法commit。git提交(commit)的時候是將暫存區的檔案全部一次性提交到倉庫永久儲存的,即一個新的主分支產生了)

$ git add readme.txt

commit 之前可以使用git diff readme.txt檢視當前工作區副本與暫存區之間的差別

$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index e69de29..3641e2c 100644
--- a/readme.txt
+++ b/readme.txt
@@ -0,0 +1,3 @@
+test
+hello world

確定後,使用git commit -m "註釋"提交到版本庫

$ git commit -m "create new file readme.txt"
[master c773499] none
1 file changed, 3 insertions(+)

使用git status檢視當前版本庫工作目錄中檔案的狀態。
檔案狀態有已提交(committed),已修改(modified),已暫存(staged),還有沒有版本控制的(untracked)。

$ git status
On branch master
nothing to commit, working tree clean

平時開發的時候,肯定有很多臨時檔案(資料夾)是不需要提交到版本庫的。但每次git status時會顯示很多Untracked files,git提供一種方案來忽略顯示這些檔案,就是在目錄中建立一個.gitignore檔案,將你不想顯示的檔案型別都羅列出來。git已經提供了常用型別的配置檔案,你不用自己建立,只需下載後手動增加修改即可,具體參考https://github.com/github/gitignore

Remarks:commit 前必須先 add ,這樣 git 才知道要 commit 什麼。

4、檢視提交日誌

使用git log可以檢視提交的詳細日誌,如果嫌太繁雜,可以使用git log --pretty=oneline顯示精簡的日誌。

$ git log --pretty=oneline
c77349985415c4eaba4ed4a5828246d2b228e471 (HEAD -> master) none
a7746fds312ef6f6jfdsopl7ss83ja7aa4ae9ijn modify readme.txt
ddf00b5312ef6f60648a941a5a223a7aa4aecc8e create new file readme.txt

前面的一大串數字字母表示提交的各個版本標識,是通過SHA1計算出來的。
括號裡的HEAD表示這是最新的提交版本。

5、版本回退

現在最新提交的版本是c77349(上面日誌中顯示的版本標識的前6位),如果想回退到註釋為modify readme.txt的版本。使用git reset --hard 需要回退的版本標識

$ git reset --hard a7746f
HEAD is now at a7746f modify readme.txt

這樣就回退到指定的版本了。
命令中的版本標識可以任意取前幾位,但一定要唯一確定。
再使用git log --pretty=oneline檢視一下提交日誌。

$ git log --pretty=oneline
a7746fds312ef6f6jfdsopl7ss83ja7aa4ae9ijn (HEAD -> master) modify readme.txt
ddf00b5312ef6f60648a941a5a223a7aa4aecc8e create new file readme.txt

發現沒,已經看不到註釋為none這條記錄了,最新的版本也跟著變成了modify readme.txt這個版本了。(與人類的觀念一致)

如此,又有一個問題,你可能又後悔了,想重新恢復到註釋為none的版本,當然你可以在Git Bash視窗記錄中找到對應的版本id來恢復。

$ git reset --hard c773499

但是,可能你想這麼做的時候已經是第二天了,電腦都關機了,哪裡還知道這個id。沒關係,
git也提供了相應的功能。輸入git reflog即可。

$ git reflog
c773499 (HEAD -> master) [email protected]{0}: reset: moving to a7746fd
c773499 (HEAD -> master) [email protected]{7}: commit: none
a7746fd (HEAD -> master) [email protected]{6}: commit: modify readme.txt
ddf00b5 [email protected]{7}: commit (initial): create new file readme.txt

它記錄了所有的commit操作資訊,當然包括對應的版本的id了,這下終於沒有後顧之憂了。

6、撤銷工作區的修改

假如你又對 readme.txt 檔案做了些修改,突然發現這些修改沒什麼意義,想撤銷你的修改,回到沒有修改以前的狀態。可以使用git checkout -- 檔名

$ git checkout -- readme.txt

如果之前沒有將此檔案新增到暫存區(add)的話,此檔案就會恢復到 HEAD 版本庫(最新的版本庫)的狀態。
如果之前已經新增到暫存區還沒有提交的話,此檔案就會恢復到新增到暫存區時的狀態。

如果已經新增到暫存區,可是還是想恢復到提交 HEAD 版本時的狀態的話,可以使用命令
git reset HEAD 檔名,將某個檔案單獨回退到最新提交的狀態(HEAD 表示最新提交的那個版本)。同時,這個命令會恢復暫存區中此檔案的狀態。

$ git reset HEAD readme.txt

7、刪除檔案並提交及誤刪處理

如果想從版本庫中刪除 readme.txt 檔案,先在工作目錄中刪除此檔案,這樣 git 就會檢測到,然後輸入命令git rm 檔名,git 會從暫存區中刪除此檔案,然後正常commit提交即可。

$ git rm readme.txt
git commit -m "delete readme.txt"
[master c773499] remove readme.txt
1 file changed, 1 deletion(-)
delete mode 100644 readme.txt

這樣檔案就從版本庫中真正的刪除了。

如果是本地檔案被誤刪了,可以使用命令git checkout -- 檔名恢復到最近一次addcommit操作的狀態。

8、遠端倉庫操作

以上介紹的所有操作都是針對本地倉庫。git 還可以對遠端倉庫進行克隆(將遠端倉庫的下載一份到本地,作為一個獨立的分支),推送(將自己的修改提交到遠端倉庫)以及拉取(檢出別人對倉庫做的提交)。
下面分步介紹:

8.1、設定SSH Key(以 github 為例)

為了使與遠端倉庫通訊更加安全,git 使用了 SSH 對通訊加密。
所以需要生成 SSH 通訊金鑰。

  1. Git Bash中輸入命令ssh-keygen -t rsa -C "您的郵箱地址",一路回車,忽略儲存路徑和密碼的設定。你就會在使用者目錄C:\Users\使用者名稱\.ssh中發現兩個檔案,id_rsa(私鑰)和 id_rsa.pub(公鑰)。
  2. 私鑰檔案不要動。在 github.com 中依次開啟 Settings-SSH and GPG keys-SSH keys,單機New SSH Key,在Title中輸入提示資訊,將id_rsa.pub的內容複製到Key中,儲存。

8.2、克隆遠端倉庫

git是分散式版本控制系統,我們可以建立一個公開的倉庫,可以讓所有人都能從這個倉庫克隆作為他們自己的分支,來幫助開源專案維護。
還是以github為例,首先在github上建立一個專案,叫gittest
我們開啟Git Bash,將目錄切換到gitwork,輸入命令git clone 遠端倉庫地址

$ git clone [email protected]:***/gittest.git
Cloning into 'gittest'...
remote: Counting objects: 4, done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 4
Receiving objects: 100% (4/4), done.
Checking connectivity... done.

遠端倉庫地址可以從github上的gittest倉庫資訊中看到。這樣在github上建立的遠端倉庫就被克隆到本地了,在當前目錄中可以看到多了一個gittest目錄,倉庫中的所有檔案也同步到本地了。

  • 檢視遠端倉庫資訊
    git remote -v

  • 推送分支
    git push origin master

    origin 為遠端倉庫在本地預設的名字(就是對應遠端倉庫的地址),master 為本地分支名,此處為主分支(也是推送到遠端倉庫的主分支上)。一般情況需保持主分支與遠端倉庫同步就行。
    如果多人都在同一個分支下工作的話,當一個人push後,另外一個人再push的話就會失敗,必須先將分支上最新的程式碼pull下來,解決衝突後,再push。

  • 抓取分支
    git pull

    pull之前必須設定本地分支與遠端分支的對應關係,可以使用git branch --set-upstream dev origin/dev來將本地分支dev與遠端倉庫
    分支dev的關係關聯起來。

8.3、將本地倉庫關聯到遠端倉庫

  • 我們還是先要在github上建立一個新的倉庫,使用命令git remote add origin 新倉庫地址,就將本地倉庫與遠端倉庫之間建立了關聯。

    git remote add origin [email protected]:***/gittest.git
    

    origin 為遠端倉庫在本地預設的名字。

  • 使用git branch --set-upstream master origin/master,將本地主分支與遠端倉庫主分支建立遠端關聯。

  • 使用git pull拉取遠端倉庫程式碼。

  • 使用git push來推送原生代碼到遠端倉庫。

    git push origin master
    

    最後的master表示要推送的本地分支名。

8.4、同步github賬戶fork的程式碼

github中曾經fork的程式碼不會自動與原作者保持同步。需要手動操作。
假設你的github中fork的倉庫地址為:[email protected]:yourname/yourfork.git
原始作者的倉庫地址為:[email protected]:authorname/projectname.git

  • 關聯原始作者的倉庫

    git remote add authorname [email protected]:authorname/projectname.git
    
  • 抓取原始作者倉庫修改的檔案

    git fetch authorname
    
  • 切換到本地主分支

    git checkout master
    
  • 合併遠端的原始作者主分支

    git merge authorname/master
    
  • 推送到自己的遠端倉庫

    git push origin master
    

9、分支操作

平時開發的時候,新開一個專案,但又不想把還沒完成的程式碼提交到主分支上。這時我們可以建立一個新的分支,來提交我們的程式碼,這樣不用擔心程式碼因未提交可能丟失,也不會影響主分支的功能。等所有功能完成後,還可將新建的分支程式碼合併到主分支上,並刪除新建的分支。

  1. 新建分支 dev
    git branch dev

  2. 切換分支(切換到dev分支)
    git checkout dev

    1、2 兩步可用git checkout -b dev直接達到。

    如果需要將遠端的 dev分支同步到本地 dev分支,需要先使用
    git branch --set-upstream-to=origin/dev dev設定關聯,然後使用
    git pull拉取就可以了。

  3. 檢視當前分支
    git branch

    從遠端倉庫克隆時,預設在本地只能看到主分支,使用git checkout -b dev origin/dev建立即可。

    使用git branch -r可以同時檢視遠端的所有分支。

    使用git branch -a可以同時檢視本地和遠端的所有分支。

    使用git push origin dev就會自動將本地 dev分支推送到遠端的 dev分支上。

  4. 合併分支(將dev分支合併到當前分支)
    git merge dev

  5. 刪除分支
    git branch -d dev

    git branch -d dev是刪除本地分支。

    如果要刪除遠端分支的話,使用
    git branch -r -d origin/dev
    git push origin :dev

如果新建分支後,主分支一直沒有提交新的操作,那麼合併的時候,基本沒有什麼顧慮。但是新建分支後,主分支上也在繼續開發,那麼合併分支的時候,如果兩個分支都對同一個檔案的相同位置做了不同的修改,就會提示產生衝突,產生衝突後,可以用git status檢視衝突檔案,git會在檔案中以<<<<<<<=======>>>>>>>來標註不同分支修改的內容,我們必須手動去掉這些標註來解決衝突後再提交就可以了。衝突解決後才能刪除新建的分支。

  • 檢視分支合併圖
    git log --graph
    git log --graph --pretty=oneline --abbrev-commit

如果當前程式碼已經寫了一點,但不想提交到分支上,臨時想切換到另一個分支分析點東西,可以使用git stash儲存工作現場。

  • 儲存工作現場
    git stash
  • 檢視儲存的工作現場
    git stash list
  • 恢復工作現場(會自動刪除儲存的工作現場記錄)
    git stash pop
  • 恢復指定的工作現場(不會自動刪除儲存的工作現場記錄)
    git stash apply [email protected]{0}
  • 刪除儲存的工作現場記錄
    git stash drop

10、標籤操作

標籤相當於倉庫的一個快照。不過標籤是針對當前分支的快照。

  • 建立標籤
    git tag v1.0 (v1.0為標籤名)

    標籤預設是打在最新的提交的那個時間點的,如果在以前的某次提交忘打的話,可以使用git log --pretty=oneline --abbrev-commit檢視那次的提交標識,使用git tag v1.0 3628164(3628164為版本標識)。
    可以使用-a 指定標籤名,-m 指定標籤說明文字。
    git tag -a v0.1 -m "version 0.1 released" 3628164,這樣的標籤稱為“附註標籤“,與“輕量標籤”對應。

  • 檢視所有標籤
    git tag

  • 檢視某個標籤資訊
    git show v1.0

  • 刪除標籤
    git tag -d v0.1

  • 切換到標籤狀態
    git checkout v0.1

  • 推送標籤
    通常git push的時候是不會將標籤也提交到git伺服器上的,需要另外手動操作。
    git push origin v0.1
    如果使用的github,可以去網站看看有沒有推送成功。

    使用git push origin –tags可以將本地所有未提交的標籤一次性提交到git伺服器。

  • 刪除遠端伺服器標籤
    先刪除本地標籤:git tag -d v0.1
    再提交到遠端:git push origin :refs/tags/v0.9:refs/tags/為固定格式,後面跟標籤名。

11、介面操作軟體

如果使用過TortoiseSVN,比較習慣介面操作的話,可以使用TortoiseGit,TortoiseGit是開源的客戶端,只支援Windows。
TortoiseGit 只是一個介面程式殼,執行必須依賴核心Git客戶端,比如msysgit。
下載地址:https://download.tortoisegit.org/tgit/

12、設定git代理

fatal: unable to access 'https://***.git': Failed to connect to chromium.googlesource.com port 443: Timed out
如果 url被牆的話,就需要設定 git代理了。

  • 設定 git代理
    git config --global http.proxy localhost:1080
    git config --global https.proxy localhost:1080
    localhost:1080為代理伺服器 ip、埠。
    如果需要使用者名稱和密碼:
    git config –global http.proxy http://user:[email protected]:8080
    git config –global http.proxy https://user:[email protected]:8080

  • 取消 git代理
    git config --global --unset http.proxy
    git config --global --unset https.proxy