【问题标题】:Git pull till a particular commitGit 拉直到特定的提交
【发布时间】:2015-10-06 09:34:51
【问题描述】:

我想做一个git pull,但只在一个特定的提交之前。

 A->B->C->D->E->F (Remote master HEAD)

所以假设我的local master HEAD 指向B,我想拉到E。我该怎么办?

这不是拉特定的提交,这是拉到特定的提交。

【问题讨论】:

  • git fetchgit merge E
  • 例如我目前在 B,但我只想拉 C、E 和 F。我想删除 D。谢谢!
  • @Frenkey 你可以合并 master 然后删除最后三个提交,然后挑选最后两个。您也可以尝试 rebase -i 以获得更可控的 git 合并
  • 如果我只想从 C 获取更改,不包括 A 和 B 的更改,只是 C 怎么办?我该怎么做?

标签: git github


【解决方案1】:

git pull 只不过是git fetch 后跟git merge。所以你可以做的是

git fetch remote example_branch

git merge <commit_hash>

【讨论】:

  • “参考这个”应该是什么?
  • @Brett 忘记发布链接了.. 完全删除了
  • @unrealsoul007 这将只合并一个特定的提交,对吗?所以要从 B 拉到 E,命令是 git merge 对吧?
  • @WimFeijen git merge E 将合并 E 及其所有祖先 CD (git 知道 AB 不需要合并,因为它们已经在您的分支中)。如果您只想要E 的更改,那么您应该改为git cherry-pick E
  • 谢谢大家的回答,我也在找同样的问题。
【解决方案2】:

首先,从远程仓库获取最新的提交。这不会影响您的本地分支机构。

git fetch origin

然后检查远程跟踪分支并执行 git log 以查看提交

git checkout origin/master
git log

获取您要合并到的提交的提交哈希(或者只是它的前 5 个字符)并将该提交合并到 master

git checkout master
git merge <commit hash>

【讨论】:

  • 我对你投了反对票,因为这不像宣传的那样有效。首先,使用您的方法“git fetch origin”它会获取所有远程分支(这应该明确指出,特别是对于在具有许多和大型分支的项目中工作的人)。其次,如果您回到历史中,使用这种方法“git merge ”不会将您的本地历史合并到想要的提交。示例:您在本地提交 100,您希望通过获取所有内容(远程 HEAD 为 100)达到 150。
  • @Placeholder 你应该在写这些废话之前阅读git fetch 的手册。除此之外,您应该阅读原始问题和我的答案。如果您遵循我的回答,那么您将不会“回到历史”,因为我明确指示用户git checkout master。总体而言,如果您对自己所做的工作不是至少 50% 清楚,请不要发布任何内容。
  • 如果其他人看不出来,git fetch origin 会显式获取 origin
  • 这很好用,比接受的答案解释得更好。
  • 最佳答案,完美运行
【解决方案3】:

您还可以拉取最新的提交,然后撤消直到您想要的提交:

git pull origin master
git reset --hard HEAD~1

master 替换为您想要的分支。

使用 git log 查看您想要恢复到哪个提交:

git log

就个人而言,这对我来说效果更好。

基本上,它的作用是提取最新的提交,然后您手动一一还原提交。使用 git log 来查看提交历史。

优点:按广告宣传。您不必使用提交哈希或拉取不需要的分支。

坏点:您需要将提交还原为一个。

警告:提交/存储所有本地更改,因为使用 --hard 您将丢失它们。 使用风险自负!

【讨论】:

  • 我不知道为什么不赞成,这似乎是最干净的方式,只要你想了解最新情况,一个简单的 pull 就可以了,不像其他一些答案
  • 不要或者为什么不更多的支持,唯一的缺点是你需要在回去之前去HEAD - 如果你必须解决冲突,我不知道会发生什么。但是这个解决方案允许git pull --rebase,与所说的相反,您可以使用git reset --hard HEAD~N直接重置回N之前的提交(即3次提交,git reset --hard HEAD~3)。
  • 你可以做git reset --hard SHA,它会将它重置为你想要的提交,不需要倒数。
【解决方案4】:

这对我有用:

git pull origin <sha>

例如

[dbn src]$ git fetch
[dbn src]$ git status
On branch current_feature
Your branch and 'origin/master' have diverged,
and have 2 and 7 different commits each, respectively.
...
[dbn src]$ git log -3 --pretty=oneline origin/master
f4d10ad2a5eda447bea53fed0b421106dbecea66 CASE-ID1: some descriptive msg
28eb00a42e682e32bdc92e5753a4a9c315f62b42 CASE-ID2: I'm so good at writing commit titles
ff39e46b18a66b21bc1eed81a0974e5c7de6a3e5 CASE-ID2: woooooo
[dbn src]$ git pull origin 28eb00a42e682e32bdc92e5753a4a9c315f62b42
[dbn src]$ git status
On branch current_feature
Your branch and 'origin/master' have diverged,
and have 2 and 1 different commits each, respectively.
...

这会拉取 28eb00、ff39e4 和之前的所有内容,但不会拉取 f4d10ad。它允许使用 pull --rebase,并尊重 gitconfig 中的 pull 设置。这是有效的,因为您基本上将 28eb00 视为一个分支。

对于我正在使用的 git 版本,此方法需要完整的提交哈希 - 不允许使用缩写或别名。你可以这样做:

[dbn src]$ git pull origin `git rev-parse origin/master^`

【讨论】:

  • 就 OP 的问题而言:git pull origin E。这具有(潜在的巨大)优势,即您不会提取(或存储)不需要的历史记录。我还没有尝试过,但是您应该可以在执行 fetch 和 merge 步骤后通过 git reset --hard E 丢弃那个“未来历史”。
【解决方案5】:

我从 this video 找到了更新的答案,接受的答案对我不起作用。

首先使用 git 从 git 克隆最新的 repo(如果还没有) git clone &lt;HTTPs link of the project&gt; (或使用 SSH)然后使用 git checkout &lt;branch name&gt; .

使用命令

git log

检查最新的提交。 复制特定提交的 shal。然后使用命令

git fetch origin <Copy paste the shal here>

按回车键后。现在使用命令

git checkout FETCH_HEAD

现在特定的提交将可供您本地使用。更改任何内容并使用 git push origin &lt;branch name&gt; 推送代码。就这样。 参考the video

【讨论】:

    【解决方案6】:

    如果您将提交合并到您的分支中,您应该获得其间的所有历史记录。

    观察:

    $ 混帐初始化 ./ 在 /Users/dfarrell/git/demo/.git/ 中初始化空的 Git 存储库 $ echo 'a' > 字母 $ git 添加字母 $ git commit -m '首字母' [master (root-commit) 6e59e76] 首字母 1 个文件已更改,1 个插入(+) 创建模式 100644 字母 $ echo 'b' >> 字母 $ git add letter && git commit -m '添加字母' 【master 7126e6d】加信 1 个文件已更改,1 个插入(+) $ echo 'c' >> 字母; git add letter && git commit -m '添加字母' [master f2458be] 加信 1 个文件已更改,1 个插入(+) $ echo 'd' >> 字母; git add letter && git commit -m '添加字母' [master 7f77979] 添加字母 1 个文件已更改,1 个插入(+) $ echo 'e' >> 字母; git add letter && git commit -m '添加字母' 【大师790eade】加信 1 个文件已更改,1 个插入(+) $ 混帐日志 提交 790eade367b0d8ab8146596cd717c25fd895302a 作者:丹·法瑞尔 日期:2015 年 7 月 16 日星期四 14:21:26 -0500 添加字母 提交 7f77979efd17f277b4be695c559c1383d2fc2f27 作者:丹·法瑞尔 日期:2015 年 7 月 16 日星期四 14:21:24 -0500 添加字母 提交 f2458bea7780bf09fe643095dbae95cf97357ccc 作者:丹·法瑞尔 日期:2015 年 7 月 16 日星期四 14:21:19 -0500 添加字母 提交 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad 作者:丹·法瑞尔 日期:2015 年 7 月 16 日星期四 14:20:52 -0500 添加字母 提交 6e59e7650314112fb80097d7d3803c964b3656f0 作者:丹·法瑞尔 日期:2015 年 7 月 16 日星期四 14:20:33 -0500 首字母 $ git checkout 6e59e7650314112fb80097d7d3803c964b3656f $ git checkout 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad 注意:查看“7126e6dcb9c28ac60cb86ae40fb358350d0c5fad”。 您处于“分离 HEAD”状态。你可以环顾四周,做实验 更改并提交它们,您可以丢弃您在此所做的任何提交 在不影响任何分支的情况下执行另一次结帐。 如果你想创建一个新分支来保留你创建的提交,你可以 再次使用 -b 和 checkout 命令来执行此操作(现在或以后)。例子: git checkout -b new_branch_name HEAD 现在位于 7126e6d... 添加字母 $ git checkout -b B 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad 切换到新分支“B” $ git pull 790eade367b0d8ab8146596cd717c25fd895302a 致命:'790eade367b0d8ab8146596cd717c25fd895302a' 似乎不是 git 存储库 致命:无法从远程存储库中读取。 请确保您拥有正确的访问权限 并且存储库存在。 $ git 合并 7f77979efd17f277b4be695c559c1383d2fc2f27 更新 7126e6d..7f77979 快进 信 | 2++ 1 个文件已更改,2 个插入(+) $猫信 一种 b C d

    【讨论】:

      【解决方案7】:

      如果您想将特定提交的代码拉取到新分支,您可以使用以下命令:

      git checkout -b <new_branch_name> <commit_hash>
      

      【讨论】:

        【解决方案8】:

        git log查看本地分支和其他分支的区别

          git log
          git merge cuY2324X
        

        然后git merge 到特定或特定提交,方法是签出到您想要将代码推送到特定提交并使用至少 6 位提交的其他分支

        【讨论】:

          【解决方案9】:

          简单明了

          git pull origin &lt;Commit-hash&gt;

          【讨论】:

            猜你喜欢
            • 2013-05-01
            • 2016-04-20
            • 2018-04-05
            • 2019-01-12
            • 2020-05-18
            • 2018-10-17
            • 2012-02-19
            • 1970-01-01
            • 2011-12-06
            相关资源
            最近更新 更多