msysgit——Git bash 入門操作流程

sangyang發表於2016-03-22

引述:廖雪峰 Git 教程

1. 建立版本庫

初始化一個Git倉庫,使用git init命令。

新增檔案到Git倉庫,分兩步:
第一步,使用命令git add <file>,注意,可反覆多次使用,新增多個檔案;
第二步,使用命令git commit,完成。

2. 工作區狀態

要隨時掌握工作區的狀態,使用git status命令。

如果git status告訴你有檔案被修改過,用git diff可以檢視修改內容。

3. 版本回退

HEAD指向的版本就是當前版本,因此,Git允許我們在版本的歷史之間穿梭,使用命令git reset –hard commit_id。

穿梭前,用git log可以檢視提交歷史,以便確定要回退到哪個版本。

要重返未來,用git reflog檢視命令歷史,以便確定要回到未來的哪個版本。

4. 工作區與暫存區

工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。

Git的版本庫裡存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動建立的第一個分支master,以及指向master的一個指標叫HEAD。

因為我們建立Git版本庫時,Git自動為我們建立了唯一一個master分支,所以,現在,git commit就是往master分支上提交更改。

你可以簡單理解為,需要提交的檔案修改通通放到暫存區,然後,一次性提交暫存區的所有修改。

5. 管理修改

Git管理的是修改,Git每次修改,如果不add到暫存區,那就不會加入到commit中。

6. 撤銷修改

場景1:當你改亂了工作區某個檔案的內容,想直接丟棄工作區的修改時,用命令git checkout — file。

場景2:當你不但改亂了工作區某個檔案的內容,還新增到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場景1,第二步按場景1操作。

場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,用git reflog檢視命令歷史, 再使用命令git reset –hard commit_id,以便確定要回到未來的哪個版本。不過前提是沒有推送到遠端庫。

7. 刪除檔案

命令git rm用於刪除一個檔案。如果一個檔案已經被提交到版本庫,那麼你永遠不用擔心誤刪,但是要小心,你只能恢復檔案到最新版本,你會丟失最近一次提交後你修改的內容。

8. 遠端倉庫

本地Git倉庫和GitHub倉庫之間的傳輸是通過SSH加密,所以,需要一點設定:建立SSH Key。在使用者主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個檔案,如果已經有了,可直接跳到下一步。

第1步:
如果沒有,開啟Shell(Windows下開啟Git Bash),建立SSH Key:$ ssh-keygen -t rsa -C “youremail@example.com”
你需要把郵件地址換成你自己的郵件地址,然後一路回車,使用預設值即可,由於這個Key也不是用於軍事目的,所以也無需設定密碼。
如果一切順利的話,可以在使用者主目錄裡找到.ssh目錄,裡面有id_rsa和id_rsa.pub兩個檔案,這兩個就是SSH Key的祕鑰對,id_rsa是私鑰,不能洩露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。

第2步:登陸GitHub,開啟“Account settings”,“SSH Keys”頁面。然後,點“Add SSH Key”,填上任意Title,在Key文字框裡貼上id_rsa.pub檔案的內容。

9. 新增遠端庫

要關聯一個遠端庫,使用命令git remote add origin git@github.com:SangYang/learngit.git

關聯後,使用命令git push -u origin master第一次推送master分支的所有內容;

此後,每次本地提交後,只要有必要,就可以使用命令git push origin master推送最新修改;

分散式版本系統的最大好處之一是在本地工作完全不需要考慮遠端庫的存在,也就是有沒有聯網都可以正常工作,而SVN在沒有聯網的時候是拒絕幹活的!當有網路的時候,再把本地提交推送一下就完成了同步,真是太方便了!

10. 從遠端庫克隆

你也許還注意到,GitHub給出的地址不止一個,還可以用https://github.com/SangYang/learngit.git這樣的地址。實際上,Git支援多種協議,預設的git://使用ssh,但也可以使用https等其他協議。

使用https除了速度慢以外,還有個最大的麻煩是每次推送都必須輸入口令,但是在某些只開放http埠的公司內部就無法使用ssh協議而只能用https。

要克隆一個倉庫,首先必須知道倉庫的地址,然後使用git clone命令克隆。

Git支援多種協議,包括https,但通過ssh支援的原生git協議速度最快。

11. 建立與合併分支

Git鼓勵大量使用分支:

檢視分支:git branch
建立分支:git branch <name>
切換分支:git checkout <name>
建立+切換分支:git checkout -b <name>
合併某分支到當前分支:git merge <name>
刪除分支:git branch -d <name>

12. 解決衝突

當Git無法自動合併分支時,就必須首先解決衝突。解決衝突後,再提交,合併完成。

用git log –graph命令可以看到分支合併圖。
用git log –graph –pretty=oneline –abbrev-commit也可以看到分支的合併情況.

13. 分支策略

在實際開發中,我們應該按照幾個基本原則進行分支管理:

首先,master分支應該是非常穩定的,也就是僅用來發布新版本,平時不能在上面幹活;

那在哪幹活呢?幹活都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,比如1.0版本釋出時,再把dev分支合併到master上,在master分支釋出1.0版本;

你和你的小夥伴們每個人都在dev分支上幹活,每個人都有自己的分支,時不時地往dev分支上合併就可以了。

Git分支十分強大,在團隊開發中應該充分應用。

合併分支時,加上–no-ff引數就可以用普通模式合併,合併後的歷史有分支,能看出來曾經做過合併,而fast forward合併就看不出來曾經做過合併。

14. Bug分支

修復bug時,我們會通過建立新的bug分支進行修復,然後合併,最後刪除;

當手頭工作沒有完成時,先把工作現場git stash一下,然後去修復bug,修復後,再git stash pop,回到工作現場。

15. Feature分支

開發一個新feature,最好新建一個分支;

如果要丟棄一個沒有被合併過的分支,可以通過git branch -D <name>強行刪除。

16 多人協作

檢視遠端庫資訊,使用git remote -v;

本地新建的分支如果不推送到遠端,對其他人就是不可見的;

從本地推送分支,使用git push origin branch-name,如果推送失敗,先用git pull抓取遠端的新提交;

在本地建立和遠端分支對應的分支,使用git checkout -b branch-name origin/branch-name,本地和遠端分支的名稱最好一致;

建立本地分支和遠端分支的關聯,使用git branch –set-upstream branch-name origin/branch-name;

從遠端抓取分支,使用git pull,如果有衝突,要先處理衝突。

17. 建立標籤

命令git tag <name>用於新建一個標籤,預設為HEAD,也可以指定一個commit id;
git tag -a <tagname> -m “blablabla…”可以指定標籤資訊;
git tag -s <tagname> -m “blablabla…”可以用PGP簽名標籤;
命令git tag可以檢視所有標籤。

18. 操作標籤

命令git push origin <tagname>可以推送一個本地標籤;
命令git push origin –tags可以推送全部未推送過的本地標籤;
命令git tag -d <tagname>可以刪除一個本地標籤;
命令git push origin :refs/tags/<tagname>可以刪除一個遠端標籤。

19. 使用GitHub

在GitHub上,可以任意Fork開源倉庫;
自己擁有Fork後的倉庫的讀寫許可權;
可以推送pull request給官方倉庫來貢獻程式碼。

20. 忽略特殊檔案

忽略某些檔案時,需要編寫.gitignore;

.gitignore檔案本身要放到版本庫裡,並且可以對.gitignore做版本管理!

(使用Windows的童鞋注意了,如果你在資源管理器裡新建一個.gitignore檔案,它會非常弱智地提示你必須輸入檔名,但是在文字編輯器裡“儲存”或者“另存為”就可以把檔案儲存為.gitignore了。)

21. 配置別名

如果敲git st就表示git status那就簡單多了,當然這種偷懶的辦法我們是極力贊成的。

我們只需要敲一行命令,告訴Git,以後st就表示status:

$ git config –global alias.st status
好了,現在敲git st看看效果。

當然還有別的命令可以簡寫,很多人都用co表示checkout,ci表示commit,br表示branch:

$ git config –global alias.co checkout
$ git config –global alias.ci commit
$ git config –global alias.br branch

配置Git的時候,加上–global是針對當前使用者起作用的,如果不加,那隻針對當前的倉庫起作用。

配置檔案放哪了?每個倉庫的Git配置檔案都放在.git/config檔案中:

$ cat .git/config
[core]

repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true

[remote “origin”]

url = git@github.com:michaelliao/learngit.git
fetch = +refs/heads/*:refs/remotes/origin/*

[branch “master”]

remote = origin
merge = refs/heads/master

[alias]

last = log -1

別名就在[alias]後面,要刪除別名,直接把對應的行刪掉即可。

而當前使用者的Git配置檔案放在使用者主目錄下的一個隱藏檔案.gitconfig中:

$ cat .gitconfig
[alias]

co = checkout
ci = commit
br = branch
st = status

[user]

name = Your Name
email = your@email.com

配置別名也可以直接修改這個檔案,如果改錯了,可以刪掉檔案重新通過命令配置。