1. 程式人生 > >Git工程開發實踐(三)——Git常用操作

Git工程開發實踐(三)——Git常用操作

file 歷史信息 ima 同步 其它 最新版本 指定 對象 revert

Git工程開發實踐(三)——Git常用操作

一、Git倉庫操作

1、Git倉庫創建

git init
在當前目錄中初始化Git倉庫
git init [project-name]
創建一個新目錄並初始化倉庫
初始化git倉庫會默認創建一個mater分支,創建名為.git的子目錄,內含初始化Git倉庫中所有的骨幹文件,此時倉庫中的文件還沒有被跟蹤。
通過git add命令來實現對指定文件的跟蹤,然後執行git commit提交。

git add .
git commit -m ‘initial project version‘

.git倉庫目錄如下:
A、HEAD:當前處於哪個分支
B、config:項目的配置信息

C、description:項目描述信息
D、index:索引文件(暫存區)
E、hooks/:系統默認鉤子腳本目錄
F、logs/:各個refs的歷史信息
G、objects/:git倉庫的所有對象(commit,tree,blog,tag)
H、refs/:標識目錄中每一個分支指向哪個commit

2、Git倉庫克隆

Git克隆倉庫的命令格式: git clone [url]
當執行git clone命令的時候,默認配置下遠程Git倉庫中的每一個文件的每一個版本都將被拉取下來。所有本地分支默認與遠程主機的同名分支,並建立追蹤關系。
克隆Git的可鏈接庫libgit2的命令如下:
git clone https://github.com/libgit2/libgit2

在當前目錄下創建一個名為libgit2的目錄,並在目錄下初始化一個.git目錄,從遠程倉庫拉取下所有數據放入.git目錄,然後從中讀取最新版本的文件的拷貝。
如果指定本地創建的倉庫名字變為libgit,可以使用:
git clone https://github.com/libgit2/libgit2 libgit
git clone是一個封裝了其它命令的命令,執行git clone命令會執行以下操作:創建一個新目錄,切換到新的目錄,然後git init來初始化一個空的Git倉庫,然後為指定的URL添加一個(默認名稱為origin)遠程倉庫(git remote add),再針對遠程倉庫執行git fetch,最後通過git checkout將遠程倉庫的最新提交檢出到本地的工作目錄。
git clone支持四種協議,HTTP(S)、SSH、Git、本地文件協議。
git clone -o newname [url]
從url克隆倉庫時指定創建目錄為newname
二、Git文件操作
1、Git文件狀態
技術分享圖片
Untracked: 未跟蹤,文件在工作目錄中,但沒有加入到倉庫,不參與版本控制。通過git add將狀態變為Staged。
Unmodified: 文件已經加入版本庫,未修改,即版本庫中的文件快照內容與工作目錄中完全一致。如果被修改,變為Modified;如果使用git rm移出版本庫,則成為Untracked。
Modified: 文件被修改,並沒有進行其它操作。通過git add可進入暫存staged狀態,使用git checkout則丟棄修改,返回到unmodified狀態。git checkout即從版本庫中取出文件,覆蓋當前修改。
Staged: 暫存狀態。執行git commit則將修改同步到版本庫中,此時版本庫中的文件和本地文件一致,文件為Unmodified狀態。執行git reset HEAD filename取消暫存,文件狀態為Modified。
文件狀態的查看可以使用如下命令:
git status [filename]
查看指定文件狀態
git status
查看所有文件狀態

2、Git添加文件與目錄

git add將工作目錄的變化添加到暫存區,以備下次提交。
git add [file1] [file2] ...
添加指定文件到暫存區
git add [dir]
添加指定目錄到暫存區,包括子目錄

git add .  添加新文件和被修改文件到暫存區,但不包括被刪除文件
git add -u  提交被修改和被刪除文件到暫存區,不包括新文件
git add -A 添加工作目錄的所有變化到暫存區

3、Git刪除文件與目錄

git rm --cached <file>
直接從暫存區刪除文件,工作區則不做改變
git reset HEAD <file>...
如果已經用add把文件加入暫存區,先需要從暫存區中撤銷;
當執行git reset HEAD命令時,暫存區的目錄樹會被重寫,被當前分支指向的目錄樹所替換,但工作區不受影響。
git clean [options]
移除所有未跟蹤文件,-d表示包含目錄,-f表示強制清除。
git rm filename
刪除暫存區、工作目錄中的文件

4、Git文件差異查看

git diff用於查看工作目錄中的文件和暫存區文件的差異
git diff [files]
當暫存區中沒有文件時,比較工作區中的文件與上次提交到版本庫中文件的差異;當暫存區中有文件時,比較當前工作區中文件與暫存區中文件的差異。
git diff --cached
比較暫存區的文件與已經提交過的文件
git diff HEAD~n
比較某個歷史版本與工作目錄中的文件差異

5、Git檢出

git checkout用於Git版本庫檢出,會重寫工作目錄,是危險的命令。
git checkout branch
檢出branch分支。將HEAD指向branch分支,用branch 的當前目錄樹更新暫存區和工作目錄。

git checkout
git checkout HEAD

顯示工作目錄、暫存區與HEAD的差異。
git checkout -- filename
用暫存區中filename文件來覆蓋工作目錄中的filename文件。
git checkout .
用暫存區全部文件覆蓋工作目錄的全部文件
git checkout -- filename
用暫存區的指定文件覆蓋工作目錄的指定文件
git checkout HEAD .
用HEAD指向分支中的全部文件覆蓋暫存區和工作目錄中的文件

git checkout HEAD <file>

用HEAD指向分支中的指定文件覆蓋暫存區和工作目錄中的文件
git checkout branch -- filename
維持HEAD的指向不變,用branch所指向提交中filename文件覆蓋暫存區和工作區中相應的文件。
git checkout commit_id -- file_name
維持HEAD的指向不變,用commit_id,所指向提交中filename文件覆蓋暫存區和工作區中相應的文件。

6、Git提交

當git commit命令執行時,將暫存區的所有文件內容在版本庫中創建一個持久的快照,然後將當前分支上的HEAD指針移到新創建的快照上。每一次提交會生成一個commit對象,每一個commit對象指向一個tree對象,每個tree對象指向一個文件夾或文件。
git commit -m [message]
提交暫存區到本地倉庫
git commit [file1] [file2] ... -m [message]
提交暫存區的指定文件到本地倉庫
git commit -a
提交工作區的變化直接到本地倉庫,對新文件無效
git commit -v
提交時顯示所有diff信息
git commit --amend -m [message]
修訂提交,使用一次新的commit,替代上一次提交。如果代碼沒有任何新變化,則用來改寫上一次commit的提交信息
git commit --amend [file1] [file2] ...
重做上一次commit,並包括指定文件的新變化
git revert commit-id
撤回指定版本的內容並提交一個新的commit,不影響之前提交的內容

7、Git日誌查看

查看提交日誌可以使用git log
git log --graph
以圖形化的方式顯示提交歷史的關系
git reflog
記錄倉庫中所有的分支的所有更新記錄,包括已經撤銷的更新。
git log --pretty=oneline
單行顯示所有提交日誌信息
git log -n
打印最近n次的提交日誌信息

8、Git文件查看

git ls-files用於查看指定狀態的文件列表
git ls-files
默認查看所有緩存的文件
git ls-files -o
查看未被跟蹤的文件
git ls-files --modified
查看被修改的文件
git ls-files -s
查看暫存區中文件詳細

9、Git壓棧儲藏

在實際工程開發中,可能需要緊急修復某個bug,但當前工作目錄中工作可能沒有完成,需要臨時保存,以便清理工作目錄,切換到其它分支進行修復。此時,可以使用壓棧儲藏功能。
git stash
將工作區的所有文件壓棧到儲藏區
git stash --list
查看壓棧儲藏區的所有stash列表
git stash pop [stash_id]
從儲藏棧彈出棧頂的數據,恢復到工作目錄,,可以指定stash_id
git stash drop [stash_id]
將儲藏棧棧頂的數據彈出拋棄,可以指定stash_id
git stash apply [--index] [stash_id]
如果執行git stash時工作區的狀態是部分文件已經加入暫存區,部分文件沒有,當執行git stash apply後會發現所有文件都變成未暫存的,如果想維持原來暫存的文件仍然是暫存狀態,可以加上--index參數。可以指定stash_id。
git stash clear
刪除儲藏棧中所有的數據

10、Git撤銷更新

git reset [options] commit_id
git reset命令主要用來根據傳遞給動作的參數來執行撤銷操作。 git reset會使HEAD指向指定的commit_id,一般會用到3個參數,參數會影響到工作區與暫存區中的修改:
--soft: 只改變HEAD的State,不更改工作區與暫存區的內容
--mixed(默認): 撤銷暫存區的修改,暫存區的修改會轉移到工作區
--hard: 撤銷工作區與暫存區的修改

11、Git文件刪除

git rm -f filename
刪除暫存區、工作目錄中的fiename文件
git rm --cached filename
刪除暫存區中的filename文件,工作目錄中不做修改
對於未跟蹤狀態的文件,直接刪除文件即可

三、Git分支操作

1、Git分支查看

git branch
列出所有本地分支
git branch -r
列出所有遠程分支
git branch -a
列出所有本地分支和遠程分支

2、Git分支創建

git branch [branch-name]
新建一個branch-name分支,但停留在當前分支
git checkout -b [branch]
新建一個branch分支並切換到該分支
git branch [branch] [commit_id]
新建一個分支,指向指定commit_id提交
git branch --track [branch] [remote-branch]
新建一個分支,並與遠程分支建立追蹤關系

3、Git分支切換

git checkout [branch-name]
切換到指定分支,並更新工作目錄
git checkout -
切換到上一個分支
git branch --set-upstream [branch] [remote-branch]
在現有指定分支與指定的遠程分支之間建立追蹤關系

4、Git分支合並

git merge用來合並一個或者多個分支到當前分支中,然後將HEAD指針移動到合並結果的提交快照上。
git merge branchname
將branchname分支合並到當前分支
git merge [remote/branch]
合並獲取的遠程分支到當前分支
git merge –ff branch
使用快進式(fast-forward)合並分支,不會產生新的合並提交快照,是默認合並方式。
git merge –no-ff branch
使用非快進式合並,會創建一個新的合並提交快照
fast-forward:
技術分享圖片
no-fast-forwar:
技術分享圖片
git cherry-pick [commit]
選擇一個commit,合並進當前分支

5、Git變基(衍合)

技術分享圖片
當前分支再mywork,當使用git merge將origin分支合並到mywork分支上時,Git創建一個新的提交C7。
技術分享圖片
如果使用git rebase將origin分支rebase到mywork分支時,Git會將當前分支mywork分支自分叉提交點(C2)後面的每個提交(commit)拷貝到origin分支後面,並將HEAD指針指向最新的提交點。
技術分享圖片
git rebase [startpoint] [endpoint]
將從startpoint到endpoint的多次提×××並為一次提交。
git rebase -i HEAD~3
將最後三次提×××並為一次提交
技術分享圖片
git rebase [startpoint] [endpoint] --onto [branchName]
將[startpoint]到[endpoint]開閉區間內的提交復制到[branchName]分支上
此時,當前HEAD處於遊離狀態,Git只是將C~E部分的提交內容復制一份粘貼到master所指向的提交後面,需要將master所指向的提交id設置為當前HEAD所指向的提交。
git reset --hard commit_id
merge不會修改提交歷史,rebase會修改提交歷史。?rebase只應用於本地沒有提交的代碼,不能用於遠程分支,get merge可以應用於遠程分支。

6、Git分支刪除

git branch -d [branch-name]
刪除本地分支,-D(大寫)強制刪除

git push [remote] --delete [branch-name]
git push [remote] :remote-branch
git branch -dr [remote/branch]

刪除遠程分支

四、Git遠程倉庫操作

git fetch [remote-name] [branch]
獲取倉庫中指定分支的更新,但不自動合並當前分支
git fetch [remote-name]
獲取倉庫所有更新,但不自動合並當前分支
git pull [remote] [remote-branch]:[local-branch]
取回遠程主機某個分支的更新,再與本地的指定分支合並
git pull
獲取當前分支的唯一遠程追蹤分支,並自動合並到當前分支
git pull [remote] [branch]
取回遠程倉庫的branch分支,並與本地當前分支合並
git pull [remote]
獲取當前分支的遠程倉庫追蹤分支,並與本地當前分支合並
git pull -p
如果遠程主機刪除了某個分支,默認情況下,git pull不會在拉取遠程分支的時候,刪除對應的本地分支。使用參數-p可以在本地刪除遠程已經刪除的分支。
git remote -v
顯示所有遠程倉庫
git remote show [remote]
顯示某個遠程倉庫的信息
git remote add [shortname] [url]
增加一個新的遠程倉庫,並命名
git remote
簡單查看遠程所有倉庫(只能查看遠程倉庫的名字)
git remote show [remote-branch-name]
查看單個倉庫
git remote add [branchname] [url]
新建遠程倉庫
git remote rename [oldname] [newname]
修改遠程倉庫
git remote rm [remote-name]
刪除遠程倉庫

git push [remote] [local-branch]:[remote-branch]
git push [remote] [local-branch]

上傳本地指定分支到遠程倉庫的追蹤分支,如果遠程分支不存在,則會被新建。
git push [remote] --force
強行推送當前分支到遠程倉庫,即使有沖突
git push [remote] --all
推送所有分支到遠程倉庫
git push [remote] :[remote-branch]
刪除遠程倉庫的指定遠程分支,等同於:
git push [remote] --delete [remote-branch]

Git工程開發實踐(三)——Git常用操作