- 遠程倉庫相關命令
檢出倉庫:$ git clone git://github.com/jquery/jquery.git
查看遠程倉庫:$ git remote -v
添加遠程倉庫:$ git remote add [name] [url]
刪除遠程倉庫:$ git remote rm [name]
修改遠程倉庫:$ git remote set-url --push [name] [newUrl]
拉取遠程倉庫:$ git pull [remoteName] [localBranchName]
推送遠程倉庫:$ git push [remoteName] [localBranchName]
強制推送更改:$ git push --force origin master
如果想把本地的某個分支test提交到遠程倉庫,并作為遠程倉庫的master分支,或者作為另外一個名叫test的分支,如下:
$ git push origin test:master // 提交本地test分支作為遠程的master分支
$ git push origin test:test // 提交本地test分支作為遠程的test分支
- 分支(branch)操作相關命令
查看本地分支:$ git branch
查看遠程分支:$ git branch -r (如果還是看不到就先git fetch origin先)
創建本地分支:$ git branch [name] ----注意新分支創建后不會自動切換為當前分支
切換分支:$ git checkout [name]
創建新分支并立即切換到新分支:$ git checkout -b [name]
直接檢出遠程分支:$ git checkout -b [name] [remoteName] (如:git checkout -b myNewBranch origin/dragon)
刪除分支:$ git branch -d [name] ---- -d選項只能刪除已經參與了合并的分支,對于未有合并的分支是無法刪除的。如果想強制刪除一個分支
,可以使用-D選項合并分支:$ git merge [name] ----將名稱為[name]的分支與當前分支合并
合并最后的2個提交:$ git rebase -i HEAD~2 ---- 數字2按需修改即可(如果需提交到遠端$ git push -f origin master 慎用!)
創建遠程分支(本地分支push到遠程):$ git push origin [name]
刪除遠程分支:$ git push origin :heads/[name] 或 $ git push origin :[name]
修改分支名稱:git branch -m <old_branch_name> <new_branch_name>
創建空的分支:(執行命令之前記得先提交你當前分支的修改,否則會被強制刪干凈沒得后悔)
$ git symbolic-ref HEAD refs/heads/[name]
$ rm .git/index
$ git clean -fdx
- 版本(tag)操作相關命令
查看版本:$ git tag
創建版本:$ git tag [name]
刪除版本:$ git tag -d [name]
查看遠程版本:$ git tag -r
創建遠程版本(本地版本push到遠程):$ git push origin [name]
刪除遠程版本:$ git push origin :refs/tags/[name]
合并遠程倉庫的tag到本地:$ git pull origin --tags
上傳本地tag到遠程倉庫:$ git push origin --tags
創建帶注釋的tag:$ git tag -a [name] -m 'yourMessage'
- 子模塊(submodule)相關操作命令
添加子模塊:$ git submodule add [url] [path]
如:$ git submodule add git://github.com/soberh/ui-libs.git src/main/webapp/ui-libs
初始化子模塊:$ git submodule init ----只在首次檢出倉庫時運行一次就行
更新子模塊:$ git submodule update ----每次更新或切換分支后都需要運行一下
刪除子模塊:(分4步走哦)
1) $ git rm --cached [path]
2) 編輯“.gitmodules”文件,將子模塊的相關配置節點刪除掉
3) 編輯“ .git/config”文件,將子模塊的相關配置節點刪除掉
4) 手動刪除子模塊殘留的目錄
- 忽略一些文件、文件夾不提交
在倉庫根目錄下創建名稱為“.gitignore”的文件,寫入不需要的文件夾名或文件,每個元素占一行即可,如
target
bin
*.db
具體參考gitignore文件屏蔽規則
- 后悔藥
刪除當前倉庫內未受版本管理的文件:$ git clean -f
恢復倉庫到上一次的提交狀態:$ git reset --hard
回退所有內容到上一個版本:$ git reset HEAD^
回退a.py這個文件的版本到上一個版本:$ git reset HEAD^ a.py
回退到某個版本:$ git reset 057d
將本地的狀態回退到和遠程的一樣:$ git reset –hard origin/master
向前回退到第3個版本:$ git reset –soft HEAD~3
修改最后的提交日志:$ git commit --amend
- Git一鍵推送多個遠程倉庫
編輯本地倉庫的.git/config文件:
[remote "all"]
url = git@github.com:dragon/test.git
url = git@gitcafe.com:dragon/test.git
這樣,使用git push all即可一鍵Push到多個遠程倉庫中。
- 緩存認證信息
$ git config credential.helper cache
- 查看提交日志
》查看文件中的每一行的作者、最新的變更提交和提交時間
$ git blame [fileName]
》查看倉庫歷史記錄
有三個應該知道的選項。
--oneline - 壓縮模式,在每個提交的旁邊顯示經過精簡的提交哈希碼和提交信息,以一行顯示。
--graph - 圖形模式,使用該選項會在輸出的左邊繪制一張基于文本格式的歷史信息表示圖。如果你查看的是單個分支的歷史記錄的話,該選項無效。
--all - 顯示所有分支的歷史記錄
把這些選項組合起來之后如下:
使用 $ git log --oneline --graph --name-status 既可以看到簡介的日志信息,也可以看到改了哪些文件,一舉兩得.
- 有選擇的合并 - 這個功能最贊,沒有之一
cherry-pick 可以從不同的分支中撿出一個單獨的commit,并把它和你當前的分支合并。如果你以并行方式在處理兩個或以上分支,你可能會發現
一個在全部分支中都有的bug。如果你在一個分支中解決了它,你可以使用cherry-pick命令把它commit到其它分支上去,而不會弄亂其他的文件或commit。
$ git cherry-pick [commitHash]
- Stash未提交的更改
正在修改某個bug或者某個特性,又突然被要求展示工作。而現在所做的工作還不足以提交,這個階段還無法進行展示(不能回到更改之前)。在這種
情況下, git stash可以幫到忙了。stash在本質上會取走所有的變更并存儲它們以備將來使用。
$ git stash
檢查stash列表:$ git stash list
想解除stash并且恢復未提交的變更,就進行apply stash:$ git stash apply
如果只想留有余地進行apply stash,給apply添加特定的標識符:$ git stash apply stash@{0}
- 多次修改后拆分提交 - 暫存文件的部分改動
一般情況下,創建一個基于特性的提交是比較好的做法,意思是每次提交都必須代表一個新特性的產生或者是一個bug的修復。如果你修復了兩個bug,或是添加了多個新特性但是卻沒有提交這些變化會怎樣呢?在這種情況下,你可以把這些變化放在一次提交中。但更好的方法是把文件暫存(Stage)然后分別提交。
例如你對一個文件進行了多次修改并且想把他們分別提交。這種情況下,可以在 add 命令中加上 -p 參數
$ git add -p [fileName]
- 壓縮多個Commit
用rebase命令把多個commit壓縮成一個:
git rebase -i HEAD~[number_of_commits]
如果你想要壓縮最后兩個commit,你需要運行下列命令:
git rebase -i HEAD~2
Docs: [http://git-scm.com/book/en/v2/Git-Branching-Rebasing](http://git-scm.com/book/en/v2/Git-Branching-Rebasing)
- 差異查看
$ git diff --name-status HEAD~2 HEAD~3 <-- 獲得兩個版本間所有變更的文件列表
$ git diff HEAD HEAD~1 <-- 查看最近兩個提交之間的差異
$ git diff HEAD HEAD~2 <-- 查看第1個與第3個提交之間的差異
^ - 代表父提交,^n 表示第n個父提交,^相當于^1 git尋根:^和~的區別 - 分析得很到位
~ - 代表連續的提交,~n相當于連續的第n個提交
$ git diff master..test <-- 比較兩個分支之間的差異
$ git diff master...test <-- 比較master、test的共有父分支和 test 分支之間的差異
$ git diff test <-- 比較當前工作目錄與 test 分支的差異
$ git diff HEAD <-- 比較當前工作目錄與上次提交的差異
$ git diff HEAD -- ./lib <-- 比較當前工作目錄下的lib目錄與上次提交的差異
$ git diff --stat <-- 統計一下有哪些文件被改動,有多少行被改動
$ git diff --cached <-- 查看下次提交時要提交的內容(staged,添加到索引中)
- Git for Windows 中文亂碼問題 (1.9.4-preview20140611)
》git log 顯示的文件名亂碼
執行 "git config –global core.quotepath false"可以解決之。core.quotepath設為false,就不會對0×80以上的字符進行quote,中文就
》ls命令顯示的中文名亂碼
改用"ls --show-control-chars"命令代替單純的"ls"命令即可。
或者編輯.../Git/etc/git-completion.bash,新增一行 alias ls="ls –show-control-chars"
資料參考:
Git Submodule 的認識與正確使用!
如何保持在 Git Submodule 代碼的開放和私有共存
Git Submodule Tutorial
刪除 git submodule
pages.github.com
Git獲取遠程分支
Git for Windows Unicode Support
Git一鍵推送多個遠程倉庫
圖解Git
使用git合并多個提交
git:多個commit合并提交
git rebase (本地分支合并) / git rebase (本地與遠程同步)
git merge 和git rebase
版本控制系統 Git 精要
10 個很有用的高級 Git 命令
git修改歷史提交
10 個迅速提升你 Git 水平的提示
git尋根:^和~的區別 - 分析得很到位
比較提交 - Git Diff
說明:Git for Windows 從 1.7.9 版本開始支持使用中文文件、文件夾名稱了,結束了跨平臺中文亂碼的問題。