[英]How do I move forward and backward between commits in git?
我正在做一個git bisect
,在到達有問題的提交之后,我現在正試圖向前/向后邁出一步,以確保我是正確的。
我知道HEAD^
到 go 在歷史上倒退,但是還有另一個捷徑可以讓我前進(朝向未來的特定提交),如下所示:
A - B - C(HEAD) - D - E - F
我知道我的目標是F並且我想從C移動到D 。
注意:這不是Git 的副本:如何在提交之間來回移動,我的問題略有不同,沒有在那里回答
我已經做了一些實驗,這似乎是向前導航的訣竅(編輯:只有當你有一個沒有合並提交的線性歷史時它才有效):
git checkout $(git rev-list --topo-order HEAD..towards | tail -1)
其中towards
是提交的 SHA1 或標簽。
解釋:
$()
中的命令意味着:獲取當前HEAD
和towards
提交之間的所有提交(不包括HEAD
),並按優先順序對它們進行排序(如git log
中一樣 - 而不是按時間順序排列,這很奇怪rev-list
),然后取最后一個( tail
),即我們要 go 到的那個。git checkout
以執行結帳。 您可以在.profile
文件中定義一個 function 可作為預期參數別名訪問,以向前導航到特定提交:
# Go forward in Git commit hierarchy, towards particular commit
# Usage:
# gofwd v1.2.7
# Does nothing when the parameter is not specified.
gofwd() {
git checkout $(git rev-list --topo-order HEAD.."$*" | tail -1)
}
# Go back in Git commit hierarchy
# Usage:
# goback
alias goback='git checkout HEAD~'
我相信你可以做到:
git reset HEAD@{1}
向 go 及時提交一次。 到 go 轉發多個提交,使用 HEAD@{2}、HEAD@{3} 等。
所有你需要弄清楚,而不是分離頭 state 是重置,而不是結帳。
git reset HEAD@{1}
這就是我用來來回導航的東西。
移動到下一個提交
function n() {
git log --reverse --pretty=%H master | grep -A 1 $(git rev-parse HEAD) | tail -n1 | xargs git checkout
}
移至上一個提交
function p() {
git checkout HEAD^1
}
說 F 是trunk
上的最新提交(在此處插入您自己的分支名稱)...您可以將其稱為trunk~0
(或只是trunk
), E 為trunk~1
, D 為trunk~2
等。
查看您的reflog以了解更多命名提交的方法。
向后遍歷是微不足道的,因為您正在向下移動樹,並且總是有一種方法可以到達 go
function git_down
git checkout HEAD^
end
向前遍歷時,您正在向上移動樹,因此您需要明確您的目標是哪個分支:
function git_up
git log --reverse --pretty=%H $argv | grep -A 1 (git rev-parse HEAD) | tail -n1 | xargs git checkout
end
用法: git down
, git up <branch-name>
如果你想提前看,你可以做這個技巧,因為 Git 沒有嚴格的命令。
git log --reverse COMMIT_HASH..
日志歷史哈希列表:
A
B
C -> put this
D
使用命令git log --reverse C..
,在 output 中,您將看到B和A 。
我剛剛對此進行了測試。 比如說你在 master 分支然后做:
git checkout HEAD@{3}
所以 head 被分離,然后你可以再試一次 go 到任何其他提交:
git checkout HEAD@{4}
環顧四周后,只需查看該分支,您就可以 go 回到原來的 state。 在我的例子中:主分支
git checkout master
如果您不想將 go 轉換為原始 state,並且希望將其中一個提交保留為您的頭部並從那里繼續,那么您需要從那里分支。 例如在“git checkout HEAD@{4}”之后,你可以發出
git checkout -b MyNewBranch
作為一種解決方法,您可以返回 HEAD
git checkout <branch>
然后轉到您想要的提交,使用
git checkout HEAD~<offset>
如果您使用的是 vs 代碼,那么 Git 歷史記錄是一個很棒的插件,您可以在編輯器本身中有效地查看提交並檢查其內容。 查看鏈接
branchName=master; commitInOrder=1; git checkout $(git log --pretty=%H "${branchName}" | tac | head -n "${commitInOrder}" | tail -n 1)
在哪里:
branchName
等於分支名稱
commitInOrder
等於從所選分支中的第一個提交開始按順序提交(因此 1 是第一個提交,2 是分支中的第二個提交,等等)
可能不是最好的方法,但您可以使用git log
查看提交列表,然后使用git checkout [sha1 of D]
移動到 D。
我會使用git-reflog
和git-reset
。
這與您運行git-bisect
的情況不同,但假設您git-reset
提交 C 並希望將其移回提交 F。
此時, git-reflog
看起來像這樣:
$ git reflog show
4444444 (HEAD -> main) HEAD@{0}: reset: moving to 4444444
1111111 HEAD@{1}: commit: F
2222222 HEAD@{2}: commit: E
3333333 HEAD@{3}: commit: D
4444444 (HEAD -> main) HEAD@{4}: commit: C
5555555 HEAD@{5}: commit: B
6666666 HEAD@{6}: commit: A
然后,您可以通過指定 SHA1 hash 或 HEAD 的偏移量來運行git-reset
到 go 回到任何提交。
在你的情況下,運行git-reset
如下:
$ git reset 1111111
或者
$ git reset HEAD@{1}
推進一次提交的最短方法是:
git checkout @{1}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.