【问题标题】:Reverse a git fetch反转 git fetch
【发布时间】:2013-02-21 15:57:36
【问题描述】:

我对 git 有透彻的了解,以及 pull、fetch 和 merge 的区别。我有一个遥控器,我偶尔会跟踪、获取和合并,假设它是源/主控。我要做的是扭转'git fetch'的行为。这听起来很傻,但我想取消更新我的远程跟踪分支指向的旧状态,即上次获取之前的状态。这可能吗?

例如,假设这是我的工作流程...

git show origin/master # shows commit abc123

git fetch              # yay i got something!

git show origin/master # shows commit def456

神秘的命令在这里...

git show origin/master # shows commit abc123

想要这有点奇怪,但我有一个 crontab 可以监视 git repo 以检测何时有东西要获取,并且我在调试基于此行为执行某些操作的脚本时遇到问题。我不想等待 origin/master 更改,而是自己更改它,以便调试我的脚本!

【问题讨论】:

  • 这并不奇怪......我刚刚获取了一些我不想要的更改,我想做同样的事情......让我的远程跟踪分支指向该 repo 的旧版本(好像我没有获取)。我知道这些更改不在我的工作目录中……我什至不希望它们出现在我的远程跟踪分支中。感谢您提出这个问题并及时得到答案以便我能够参考它:-)

标签: git git-fetch


【解决方案1】:

你想要

git update-ref refs/remotes/origin/master refs/remotes/origin/master@{1}

update-ref 想要它正在更新的 ref 上的完整拼写,因为它比尊重 ref 命名约定的命令低得多。

【讨论】:

  • 太棒了,这正是我想要的!可以说这个命令完全是“撤消提取”。但我想知道命令中的 {1} 是什么意思?我想用 30 多个新提交撤消 fetch 并且 {3} 为我工作,而不是“30”
  • @{} 语法记录在这里:git-scm.com/book/en/v2/Git-Tools-Revision-Selection#_git_reflog。简而言之,@{n} 表示“来自 reflog 的第 n 个条目”。 git log -g origin/master 显示 origin/master 的 reflog,带有 @{n} 注释。所以@{1} 的意思是“在最后一次获取之前”,假设你在获取之后立即运行它。
【解决方案2】:

这不是“反向 git fetch”的答案,但您的实际问题似乎是如何以编程方式“观察 repo 的更改”,而不必以任何方式更改您的存储库。

为此,您可以使用git fetch --dry-run。空运行不会对您的存储库造成任何更改,但是如果远程有更改,那么它将有一些基本的终端输出;如果没有更改,则不会有任何输出。如果您想让它作为自动脚本运行而不是手动检查,那么创建一个简单的 bash 脚本来测试 git fetch --dry-run 的输出应该相对简单。

【讨论】:

    【解决方案3】:

    我不确定是否有实际的 git 命令来执行此操作,这是一个很大的 hackish,但是...

    echo $OLD_COMMIT > .git/refs/remotes/origin/master
    

    应该有效

    【讨论】:

      【解决方案4】:

      我希望这次我得到了你想要的,我想是这样的:

      git rebase origin/master --onto origin/master^
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-06
        • 2023-03-04
        • 2014-02-27
        • 2014-03-31
        • 2021-06-04
        • 2012-11-07
        • 2022-06-14
        相关资源
        最近更新 更多