Git時間:常用Git命令收集整理(持續更新)


根據網絡資源進行整理,記錄的比較詳細方便自己日后查看。以下列舉的命令可以在項目目錄打開GitBash使用,也可以在AndroidStudio或者IntelliJ等支持Git的IDE中使用。


基礎概念Repositiry

在版本管理中,Repository翻譯過來就是倉庫的意思,每個提交到本地,或者PUSH到遠程服務器的 Project,被 Github以數據結構的形式保存,而這個數據結構被稱為 Repository 即倉庫。

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

查看當前的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的區別是,合並后節點信息不一樣,如下圖所示:

merge&rebase

同步遠程服務器數據到本地:

$ 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}

未完待續,此篇博客會長期更新補充(o)/~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM