GIT使用—提交的查找與變動

1、查找提交

(1)git bisect(二分搜索法)
基於任意搜索條件查找特定的錯誤提交。在排查某個提交版本致使的錯誤時很是有用。html

[root@localhost public_html]# git bisect start   開始搜索
[root@localhost public_html]# git bisect bad   告知GIT那個提交時「壞」的,一般是當前版本
[root@localhost public_html]# git bisect good v2.6.27  告知那個版本提交是「好」的,一般是測試經過版本
以後Git會在範圍內將每一個修訂版本搜索出來,以後你要作的就是縮小排查範圍。

最後要告訴Git已經完成
[root@localhost public_html]# git git bisect reset
[root@localhost public_html]# git branch
* master

(2)git blame
此命令告訴你一個文件中的每一行最後是誰修改的和哪次提交作出了變動。git

[root@localhost public_html]# git blame -L 1, index.html 
0a307160 (tong 2018-02-27 11:52:29 +0800 1) <html>
0a307160 (tong 2018-02-27 11:52:29 +0800 2) <body>
^b4e2a14 (tong 2018-02-27 11:45:23 +0800 3) My website is alive!
0a307160 (tong 2018-02-27 11:52:29 +0800 4) </body>
0a307160 (tong 2018-02-27 11:52:29 +0800 5) </html>

(3)Pickaxe
git log -Sstring根據給定的條件沿着文件的差別歷史搜索。經過搜索修訂版本間的實際差別,這條命令能夠找到那些執行改變的提交。web

[root@localhost public_html]# git log -Shtml --pretty=oneline --abbrev-commit index.html 
0a30716 This is new html!

2、查看提交歷史

[root@localhost public_html]# git log
commit aa431d938e85445f6c22c7389a37349f587d5b01
Author: tong <tongxiaoda@anzhi.com>
Date:   Tue Feb 27 13:06:21 2018 +0800

    mv bar to foo

commit 1ed9a862e62bd5513021838cb435cf8170e2173d
Author: tong <tongxiaoda@anzhi.com>
Date:   Tue Feb 27 13:04:37 2018 +0800

    new bar

commit 19a473c2e935efa59b8edea19d2d12be96987a97
Author: tong <tongxiaoda@anzhi.com>
Date:   Tue Feb 27 12:00:03 2018 +0800

    Remove a poem

commit 5be473e1ed6d04ed9e96b7fa3e9e2860607cbd31
Author: tong <tongxiaoda@anzhi.com>
Date:   Tue Feb 27 11:59:16 2018 +0800

    add poem.html

commit 0a3071601cc10777e271a952ead46cffba233e24
Author: tong <tongxiaoda@anzhi.com>
Date:   Tue Feb 27 11:52:29 2018 +0800

    This is new html!

commit b4e2a14de84d29ea8890a2e19f039eb08bc2fc7d
Author: tong <tongxiaoda@anzhi.com>
Date:   Tue Feb 27 11:45:23 2018 +0800

    Initial contents of public_html

能夠用 --graph 選項,查看歷史中何時出現了分支、合併。測試

[root@localhost public_html]# git log --oneline --graph
* aa431d9 mv bar to foo
* 1ed9a86 new bar
* 19a473c Remove a poem
* 5be473e add poem.html
* 0a30716 This is new html!
* b4e2a14 Initial contents of public_html

能夠用 '--reverse'參數來逆向顯示全部日誌。3d

[root@localhost public_html]# git log --reverse --oneline
b4e2a14 Initial contents of public_html
0a30716 This is new html!
5be473e add poem.html
19a473c Remove a poem
1ed9a86 new bar
aa431d9 mv bar to foo

若是隻想查找指定用戶的提交日誌能夠使用命令:git log --author日誌

[root@localhost public_html]# git log --author=tong --oneline -3
aa431d9 mv bar to foo
1ed9a86 new bar
19a473c Remove a poem

若是你要指定日期,能夠執行幾個選項:--since 和 --before,可是你也能夠用 --until 和 --after。
--no-merges 選項以隱藏合併提交code

[root@localhost public_html]# git log --oneline --before={3.weeks.ago} --after={2018-01-01} --no-merges

3、更改提交

git reset命令會把版本庫和工做目錄改變爲已知狀態,其調整HEAD引用指向給定的提交,默認狀況下還會更新搜索引以匹配該提交。htm

git reset-soft
將HEAD引用指向給定提交,索引和工做目錄內容保持不變。blog

git reset--mixed(默認模式)
將HEAD指向給定提交,索引內容也跟着改變以符合給定提交的樹結構,但工做目錄中的內容保持不變。索引

git reset-hard
將HEAD指向給定提交,索引內容也跟着改變以符合給定提交的樹結構,工做目錄內容也隨之改變以反映給定提交表示的樹的狀態。

簡單地重作或清除分支上的最近提交

[root@localhost ~]# cd test
[root@localhost test]# git init
Initialized empty Git repository in /root/test/.git/
[root@localhost test]# echo foo >> master_file
[root@localhost test]# git add master_file 
[root@localhost test]# git commit
[master (root-commit) 96a97fb] This is test!
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 master_file
[root@localhost test]# echo "more foo" >> master_file 
[root@localhost test]# git commit master_file 
[master 8b6ce36] Change master_file
 1 files changed, 1 insertions(+), 0 deletions(-)
[root@localhost test]# git show-branch --more=5
[master] Change master_file
[master^] This is test!

假設第二次提交是錯的,須要改變一下
[root@localhost test]# git reset HEAD^
Unstaged changes after reset:
M   master_file
[root@localhost test]# git show-branch --more=5
[master] This is test!
[root@localhost test]# cat master_file 
foo
more foo
執行後Git離開了master_file的新狀態,由於重置了索引,因此必須從新暫存你想要提交的修改

[root@localhost test]# echo "even more foo" >> master_file 
[root@localhost test]# git commit master_file 
[master eaf3fca] new change master_file
 1 files changed, 2 insertions(+), 0 deletions(-)
[root@localhost test]# git show-branch --more=5
[master] new change master_file
[master^] This is test!

查看版本庫中引用變化的歷史記錄
[root@localhost test]# git reflog
eaf3fca HEAD@{0}: commit: new change master_file
96a97fb HEAD@{1}: HEAD^: updating HEAD
8b6ce36 HEAD@{2}: commit: Change master_file

使用git cherry-pick提交命令會在當前分支上應用給定提交引入的變動。這並不改變版本庫中的現有歷史記錄,而是添加歷史記錄。
一般用於版本庫中一個分支的特定提交引入不一樣的分支中,即把維護分支的提交移植到開發分支。

git checkout rel_2.3
git cherry-pick dev~2

使用git revert將引入一個新提交來抵消給定提交的影響。

git revert master~3

修改最新提交

git commit --amend --author "Bob <Bob@test.com>"
相關文章
相關標籤/搜索