Git 的優勢
- 離線工作:每個人的電腦都是一個完整的版本庫,即使不連接服務器,也可以在本地進行版本管理;
- 強大的分支管理;
創建倉庫
clone 一個已存在的倉庫
git clone ssh://user@domain.com/repo.git
創建一個新的本地倉庫
git init
本地倉庫和遠程倉庫:
本地倉庫以一個隱藏的文件夾(
.git
)的形式存儲在項目的根目錄下;
遠程倉庫沒有工作目錄,完全由.git
倉庫目錄組成。開發團隊使用遠程倉庫進行數據共享和交換。
本地修改
查看工作副本的狀態:git status
查看與上次版本文件的不同:git diff
添加所有修改到暫存區,等待下次提交:git add .
提交暫存區的文件到本地倉庫:git commit -m "commit comment"
修改上次的提交(請勿修改已經推送到遠程的提交記錄):git commit --amend
或者,直接帶上要修改的注釋:git commit --amend -m "This is the correct message"
也可以添加更多的改動到上次的提交中:
git add file.txt
git commit --amend -m "commit message"
查看日志
查看所有的提交記錄:git log
指定顯示 log 的數目:git log -<num>
查看提交時文件的變化:git log -p
顯示指定文件的所有修改:git log -p <file>
誰,在什么時間,修改了文件的什么內容:git blame <file>
只看某人的提交:git log --author=<name>
每條日志單行顯示:git log --pretty=oneline
查看每一次操作,包括回退:git reflog
查看分支合并圖:git log --graph --pretty=oneline --abbrev-commit
查看遠程倉庫的日志:git log origin/master
分支操作
創建、合并和刪除分支非常快,所以 Git 鼓勵使用分支完成某個任務,合并后再刪掉分支,這和直接在 master 分支上工作效果是一樣的,但過程更安全。
創建新分支(基于當前分支):git branch <new-branch>
創建新的可追溯的分支(基于遠程分支):git checkout --track <remote/branch-name>
創建并切換分支:git checkout -b dev
切換分支:git checkout <branch>
查看分支:git branch
查看所有分支(包括遠程),并顯示最后一次的提交記錄:git branch -av
合并分支:git merge <branch>
刪除分支:git branch -d <branch>
刪除一個沒有被合并的分支:git branch -D dev
刪除遠程倉庫的分支:git branch -dr <remote/branch>
下載遠程的 dev 分支 :git checkout -b dev origin/dev
設置本地分支 dev 和遠程分支 origin/dev 的關聯:git branch --set-upstream-to=origin/dev dev
標簽操作
Git 標簽其實是一個指向某個 commit 的指針,所以創建和刪除標簽都是瞬間完成的。
給當前的提交打標簽:git tag <tag-name>
指定給某次的提交打標簽:git tag <tag-name> <commit-id>
用 -a
指定標簽名,用 -m
指定說明文字 :git tag -a <tag-name> -m <message> <commit-id>
查看標簽:git tag
查看某個標簽的信息 :git show <tagname>
推送某個標簽:git push origin v1.0
推送所有標簽:git push --tags
刪除本地標簽:git tag -d <tag-name>
刪除遠程標簽:
- 先刪除本地標簽;
- 然后推送:
git push origin :refs/tags/<tag-name>
遠程倉庫
添加遠程倉庫(一般把 remote 命令為 origin
,可以添加多個遠程倉庫):git remote add <remote> <url>
列出當前配置的遠程倉庫:git remote -v
查看遠程倉庫的信息:git remote show <remote>
刪除遠程倉庫:git remote rm <remote>
修改遠程倉庫的地址:git remote set-url <remote> <url>
更新/下載
下載遠程倉庫的所有改動到本地,不會自動合并到當前:git fetch <remote>
下載遠程倉庫的所有改動到本地,自動合并到當前:git pull <remote> <branch>
將本地版本發布到遠程倉庫:git push <remote> <branch>
第一次推送 master 分支到 origin:git push -u origin master
,添加 -u
,會把本地的 master 分支和遠程的 master 分支關聯起來,以后推送可以直接使用 git push
比較操作
查看當前工作副本中所有未提交的變化:git diff
指定要查看的文件:git diff <filename>
與版本庫的任意版本比較文件:git diff <commitID> -- <file>
比較任意兩個版本之間的內容:git diff <commitID> <commitID>
比較兩個分支之間的內容:git diff master dev
保存/恢復工作區
不要提交還未完成的工作。
臨時需要修改一個bug,當前的任務又沒有完成,不能提交。執行 git stash
,可以把當前工作現場“儲藏”起來,等以后恢復現場后繼續工作。
改完 bug 之后,要恢復工作區,繼續之前的工作:
查看 stash:git stash list
恢復:git stash apply
,恢復之后,stash 內容沒有刪除,用 git stash drop
來刪除;
恢復并刪除:git stash pop
可以執行多次 git stash
保存工作區,恢復的時候,指定 stash id:git stash apply stash@{0}
儲藏功能可以幫助我們得到一個干凈的工作副本。當然,它還可以應用在很多不同的流程中,強烈推薦在下列情況中儲藏你的本地改動:
- 在切換到不同分支之前。
- 在獲取(pulling)遠程改動之前。
- 在合并(merging)或者衍合(rebasing)一個分支之前。
撤銷
在 Git 中,用 HEAD
表示當前版本,上一個版本就是 HEAD^
,上上一個版本就是HEAD^^
,往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100
。
放棄工作副本中的所有修改(回退到當前版本):git reset --hard HEAD
回退到指定版本,放棄之后的修改(查看 git log
,已經回退到之前的提交)
git reset --hard <commit-id>
(不使用 --hard
會保留之前的修改,放在工作副本中)
回退之后又想回去了:
先使用 git reflog
查看所有的操作,找到 commitID 再進行回退。
使用 revert 進行回退(查看 git log
,創建了一個新的提交):git revert <comit-id>
修改了文件,還沒有執行 add,此時文件在工作區,回退到之前的版本:git checkout -- <file>
修改了文件,執行了 add ,此時文件在暫存區,回退:git reset HEAD <file>
配置
使用.giignore
文件,忽略不想要管理的文件。這里有模版 https://github.com/github/gitignore
文件別忽略了,也可以強制添加:git add -f target/
檢查 .gitignore
是否有問題:git check-ignore -v .gitignore
配置別名:git config --global alias.st status
然后就可以使用 git st
代替 git status
了。
當前倉庫的配置文件在 .git/config
文件中,全局的 git 配置文件在用戶目錄下的 .gitconfig
。
使用 git
- 一次提交僅僅對應一個相關的改動,不要把那些互相毫無關聯的改動打包在同一次提交中。
- 不要提交不完整的改動,保存當前的工作用
git stash
。 - 每次提交都要詳細的注釋,說清楚:為什么要改?改了什么?。
- 養成頻繁提交的習慣,避免很龐大的提交,這樣也容易避免沖突的發生。
- 使用強大的分支,比如:開發新功能,修改 bug 等。
- 遵循一致的工作流程,比如:長期分支,特性分支,merge 還是 rebase 等。
- 使用幫助文檔:
git help <command>
參考網站
可視化工具
SourceTree,跨平臺,免費。
Tower,Mac 上非常出名的 git 工具,目前已經有 windows 版本,收費。