根據網絡資源進行整理,記錄的比較詳細方便自己日后查看。以下列舉的命令可以在項目目錄打開GitBash使用,也可以在AndroidStudio或者IntelliJ等支持Git的IDE中使用。
基礎概念Repositiry
在版本管理中,Repository翻譯過來就是倉庫的意思,每個提交到本地,或者PUSH到遠程服務器的 Project,被 Github以數據結構的形式保存,而這個數據結構被稱為 Repository 即倉庫。
配置用戶信息(config命令)
配置個人用戶名和郵件地址,每次 Git 提交時都會引用這兩條信息,說明是誰提交了更新
$ git config --global user.name “youname”
$ git config --global user.email “12345@example.com”
如果用了 --global
選項,那么更改的配置文件位於你用戶主目錄下,以后所有項目都默認使用這里配置的用戶信息。如果要在某個特定項目中使用其他名字或者電郵,只要去掉 --global
選項重新配置即可,新設定保存在當前項目的 /.git/config
文件里。
命令輸入的自動補全功能,輸入命令后按tab鍵,就會看到列出所有匹配的可用命令建議:
$ git co<tab>
提交(commit)推送(push)與拉取(pull)
初始化一個本地倉庫:
$ git init
初始化后,在當前目錄下會出現一個名為 .git 的目錄,所有 Git 需要的數據和資源都存放在這個目錄中。不過目前,僅僅是按照既有的結構框架初始化好了里邊所有的文件和目錄,但我們還沒有開始跟蹤管理項目中的任何一個文件
$ git init –-bare
初始化加上--bare參數后會建立一個以分享/分布式開發為目的的純粹服務器倉儲,而 git init
或者 git clone
都是建立(或拷貝)一個本地的開發工作目錄。
如果當前目錄下有幾個文件想要納入版本控制,需要先用 git add
命令對這些文件進行跟蹤,然后提交:
跟蹤文件:(將文件加到暫存區域)
$ git add <filename>
跟蹤全部文件:
$ git add .
提交(commit)更新:通過commit命令提交至本地倉庫中,每一次commit都意味着版本在進行一次更新。
$ git commit -m "commit-desc"
注意commit只是將修改提交到本地的倉庫,並沒有更新服務器。
如果覺得暫存區繁瑣,$ git commit -a
命令會自動把所有已經跟蹤的文件暫存起來一並提交,從而省略 git add
步驟。
移除文件:(remove),只能移除一個文件
$ git rm <filename>
如果需要移除 abc 目錄下的所有文件,則可以用遞歸移除命令,加 -m 參數,如下:
$ git rm -m abc/*
重命名文件:(rename)
$ git mv oldname.txt newname.txt
推送(PUSH)數據到倉庫:
$ git push [remote-name] [branch-name]
比如,將本地[master]分支推送(push)到Github服務器[origin]分支(說明下:克隆操作會自動使用默認的master 和origin 名字),可以運行下面的命令:
$ git push origin master
獲取遠程分支的最新版本(修改)到本地有兩種方式:
$ git pull <remote-name>
從遠程獲取最新版本到地,並且會自動merge!
$ git fetch <remote-name>
從遠程獲取最新版本到地,不會自動merge,並且 $ git fetch
可得到遠程代碼倉庫中本地沒有的分支
添加與克隆遠程倉庫
把倉庫從遠程服務器克隆到本地:(三種方式)
$ git clone git://github.com/youname/project.git
$ git clone git@github.com:youname/project.git
$ git clone https://github.com/youname/project.git
這時可以使用 ls -al
命令查看目錄文件列表,命令如下:
$ ls -al
/.git目錄: 把倉庫克隆到本地后在工作目錄下會有一個默認隱藏的 .git目錄,就是Git倉庫。其中存放的是我們所提交的文檔索引內容,Git基於文檔索引內容對其所管理的文檔進行內容追蹤,從而實現文檔的版本控制。.git目錄位於工作目錄內。
創建 [.gitignore] 文件:
$ touch .gitignore
/.gitignore文件用於配置git忽略文件規則。項目中有很多文件不必使用git管理,例如Eclipse或其他IDE生成的項目文件,編譯生成的各種目標或臨時文件等。使用git status時,會在Untracked files里面看到這些文件列表。在文件.gitignore中配置規則來告訴git把這些文件忽略。支持通配符,例如:
*.a #忽略所有以.a為后綴的文件;
!lib.a #不忽略文件lib.a;
/TODO #只忽略此目錄下TODO文件,子目錄的TODO不被忽略;
build/ #忽略build目錄下的所有文件;
doc/*.txt #只忽略doc/下所有的txt文件,但是不忽略doc/subdir/下的txt文件
對於已經加入到索引的應該忽略的文件,使用命令將要忽略的文件從索引中刪除:
$ git rm --cached filename
或者
$ git update-index --force-remove foo.class
向遠程服務器添加倉庫:(遠程倉庫必須先在github上建好)
$ git remote add [shortname] [url]
例如:$ git remote add origin git@github.com:youname/yourRepo.git
碰到遠端倉庫服務器遷移,或者原來的克隆鏡像不再使用,又或者某個參與者不再貢獻代碼,那么需要移除對應的遠端倉庫
遠程倉庫的刪除:
$ git remote rm <repo-name>
遠程倉庫重命名,從
$ git remote rename <from-name> <to-name>
狀態(status)和日志(log)
查看配置信息:查看已有的配置信息
$ git config --list
$ git config -l
獲取幫助:例如想獲取config命令的幫助信息
$ git help config
$ git config --help
檢查當前文件狀態:
$ git status
查看提交日志:(默認不使用任何參數,會按時間列出所有更新,最近的更新排在最上面)
$ git log
我們常用 -p 命令展開顯示每次提交的內容差異,用 -2 命令則僅顯示最近兩次更新:
$ git log -p -2
另外 --stat 命令僅簡要的顯示文件增改行數統計,每個提交都列出了修改過的文件,以及其中添加和移除的行數,並在最后列出所有增減行數小計:
$ git log --stat
另外 --author 命令僅顯示指定作者相關的提交:(查找 author 提交的版本)
$ git log --author=author
查看HEAD信息
HEAD可以理解為一個指針,每次都指向當前分支的最后一次信息(commit或者pull),通過移動HEAD可以切換分支;如果當前分支在master,那么HEAD信息可以用下圖表示:
查看當前的HEAD信息:
$ cat .git/HEAD
Diff命令:比較差異
顯示工作目錄與暫存區文件的差異(修改之后還沒有暫存起來的變化內容),不加參數:
$ git diff
(show diff of unstaged changes.)
顯示暫存區與上次提交的git倉庫之間的差異:
$ git diff --cached
(show diff of staged changes. Git 1.6.1 及更高版本還允許使用 $ git diff --staged,效果是相同的).
比較工作區和上次提交之間所有的改動:
$ git diff HEAD
$ git diff HEAD^ 比較上次提交,HEAD^也就是HEAD~1
$ git diff HEAD~2 比較上2次提交
(show diff of all staged or unstated changes.)
使用圖形工具顯示文件之間的差異:
git difftool
列出文件列表,顯示差異:
git diff --stat
比如,獲得兩個版本間所有變更的文件列表:
git diff --name-status HEAD~2 HEAD~3
只對比給定的文件
git diff -- filename
歷史提交對比可用下列命令
比較當前工作目錄與指定版本改動:
$ git diff <version-tag>
跟log命令一樣,diff也可以加上--stat
參數來簡化輸出:
$ git diff <version-tag> --stat
比較兩次提交版本(或者兩個分支)的內容改動:
$ git diff <version-tag-1> <version-tag-2>
等價於
$ git diff <version-tag-1>..<version-tag-2>
如果省略任意一個<version-tag>
,默認將使用HEAD
代替。其中,<version-tag>
可以是簡寫的commit哈希值,也可是是HEAD
。其中HEAD
代表最后一次提交,HEAD^
代表最后一次提交的父提交,HEAD~1
等價於HEAD^
,HEAD~2
為倒數第二次提交,以此類推。
GIT分支:可以很方便的創建新分支,在新分支上解決問題,完成測試后將新分支合並到master分支
查看當前分支:(當前分支默認為 master
分支)
$ git branch
查看本地和遠程的所有分支:
$ git branch -a
查看各個分支最后一個提交對象的信息:
$ git branch -v
創建一個名為“testing”的新分支:
$ git branch <branch-name|testing>
切換到“testing”分支(創建完成后,當前所在分支為 master
分支,當前分支一般會有 * 標示):
$ git checkout testing
新建並切換到新分支(和以上兩個命令的效果相同):
$ git checkout -b <branch-name>
這條命令相當於執行下面這兩條命令:
$ git branch <new-branch>
$ git checkout <new-branch>
從A分支創建並切換到B分支,可以這樣寫(如果不寫<branch-A>
則默認從當前分支創建並切換到B分支):
$ git branch -b <branch-B> <branch-A>
刪除hotfix分支:(如果該分支還未被合並則會提示錯誤,因為這樣會丟失數據)
$ git branch -d hotfix
強制刪除hotfix分支:(強制刪除,不會提示錯誤)
$ git branch -D hotfix
推送本地分支到遠程分支:
$ git push origin <local-branch>:<remote-branch>
其中,<local-branch>
為本地分支,<remote-branch>
為遠程分支,若遠程分支不存在則會自動創建;
類似,如果<local-branch>
留空,效果則是刪除遠程<remote-branch>
分支,命令如下:
git push origin :<remote-branch>
切換到遠程分支:
$ git checkout remotes/origin/<branch-name>
合並分支
把<branch>
分支的代碼合並到master
分支:(需要先切換到master
分支,再執行merge)
$ git checkout master
$ git merge <branch>
合並代碼沖突:當合並代碼時經常會出現沖突,也可能出現在從遠程倉庫pull倉庫時。可先用 $ git status 檢查沖突狀態,解決問題(比如使用AndroidStudio的Compare試圖進行對比分析)后再合並,比如:
<manifest>
<application>
android:label="demo"
<<<<<<< HEAD
android:icon="@drawable/app_icon"
=======
android:theme="@style/AppTheme"
>>>>>>> [remote-branch]
</application>
</manifest>
注意:<<<<<<<
與=======
中間的內容是當前用戶工作目錄的修改,而=======
與>>>>>>>
中間內容是遠程分支[remote-branch]別人提交的修改
查看已經與當前分支合並的分支:(已經合並的查出來后可以刪掉)
$ git branch --merge
查看未與當前分支合並的分支:
$ git branch --no-merged
rebase
也是合並命令,rebase
和merge的區別是,合並后節點信息不一樣,如下圖所示:
同步遠程服務器數據到本地:
$ git fetch origin
從新添加的遠程倉庫下載數據:
$ git remote add teamone git://git.team1.ourcompany.com
$ git fetch teamone
分化一個新的分支:(使用這個命令會從服務器上下載master最新的版本,所以如果當前本地版本不是最新的,新的分支和本地分支會不同)
$ git checkout -b test1 origin/master
假如你用這個新的分支進行git push,並且通過了合並,那么會在遠程倉庫建立一個新的同名分支,刪除該分支:
$ git push origin :test1
衍合(這個比較高級)
根據當前分支(也就是要進行衍合的分支test1)后續的歷次提交對象(這里只有一個 C3),生成一系列文件補丁,然后以主干分支master
最后一個提交對象(C4)為新的出發點,逐個應用之前准備好的補丁文件,最后會生成一個新的合並提交對象(C3'),從而改寫 test1 的提交歷史,使它成為master
分支的直接下游:
分支的衍合:將test1分支衍合到master
主分支
$ git checkout test1
$ git rebase master
另一種方法,直接衍合,不用再先切換到test1
$ git rebase master test1
快進master分支
$ git checkout master
$ git merge client
注意衍合:一旦分支中的提交對象發布到公共倉庫,就千萬不要對該分支進行衍合操作。
版本回退(reset)
一般在版本回退之前會先用 $ git status
命令查看當前狀態:
$ git status
后退操作reset:(回檔某個文件,比如文件
HEAD
信息可通過
$ git log
命令查看)
$ git reset HEAD <filename>
儲藏(Stash)
為完成一項緊急需求需要切換到其他分支,而你正在做的工作處於比較雜亂的狀態,此時就可以儲藏,使用命令:
$ git stash
查看所有儲藏:
$ git stash list
重新應用指定儲藏:(如不指定 stash@{o} ,則默認應用最近stash)
$ git stash apply stash@{o}
刪除指定儲藏:
$ git stash drop stash@{o}