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 -- 檔名
恢復到最近一次add
或commit
操作的狀態。
8、遠端倉庫操作
以上介紹的所有操作都是針對本地倉庫。git 還可以對遠端倉庫進行克隆(將遠端倉庫的下載一份到本地,作為一個獨立的分支),推送(將自己的修改提交到遠端倉庫)以及拉取(檢出別人對倉庫做的提交)。
下面分步介紹:
8.1、設定SSH Key(以 github 為例)
為了使與遠端倉庫通訊更加安全,git 使用了 SSH 對通訊加密。
所以需要生成 SSH 通訊金鑰。
- 在
Git Bash
中輸入命令ssh-keygen -t rsa -C "您的郵箱地址"
,一路回車,忽略儲存路徑和密碼的設定。你就會在使用者目錄C:\Users\使用者名稱\.ssh
中發現兩個檔案,id_rsa(私鑰)和 id_rsa.pub(公鑰)。 - 私鑰檔案不要動。在 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、分支操作
平時開發的時候,新開一個專案,但又不想把還沒完成的程式碼提交到主分支上。這時我們可以建立一個新的分支,來提交我們的程式碼,這樣不用擔心程式碼因未提交可能丟失,也不會影響主分支的功能。等所有功能完成後,還可將新建的分支程式碼合併到主分支上,並刪除新建的分支。
新建分支 dev
git branch dev
切換分支(切換到dev分支)
git checkout dev
1、2 兩步可用
git checkout -b dev
直接達到。
如果需要將遠端的 dev分支同步到本地 dev分支,需要先使用
git branch --set-upstream-to=origin/dev dev
設定關聯,然後使用
git pull
拉取就可以了。檢視當前分支
git branch
從遠端倉庫克隆時,預設在本地只能看到主分支,使用
git checkout -b dev origin/dev
建立即可。
使用git branch -r
可以同時檢視遠端的所有分支。
使用git branch -a
可以同時檢視本地和遠端的所有分支。
使用git push origin dev
就會自動將本地 dev分支推送到遠端的 dev分支上。合併分支(將dev分支合併到當前分支)
git merge dev
刪除分支
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