簡體   English   中英

如何在 git 中的提交之間前后移動?

[英]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 或標簽。

解釋:

  • $()中的命令意味着:獲取當前HEADtowards提交之間的所有提交(不包括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 中,您將看到BA

我剛剛對此進行了測試。 比如說你在 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。

對於 GUI 和 vscode 用戶,我建議使用擴展 git 圖

在此處輸入圖像描述

我會使用git-refloggit-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM