Git拉到特定的提交


106

我想做一个,git pull但是直到特定的提交。

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

所以假设我的local masterHEAD指向B,我想一直坚持下去E。我该怎么办 ?

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



3
git fetchgit merge E

例如,我目前在B中,但是我只想拉C,E和F。我想删除D。谢谢!
Frenkey

@Frenkey,您可以合并母版,然后删除最后三个提交,然后樱桃选择最后两个提交。您也可以尝试使用rebase -i进行更受控的git合并
Ninja420 '19

如果我只想从C中获取更改,不包括A和B的更改而仅包含C怎么办?我怎样才能做到这一点?
Vikas Chauhan

Answers:


120

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

git fetch remote example_branch

git merge <commit_hash>


“引用此”应该是什么?
developerbmw

@Brett Forgot发布了链接。.完全删除了它
unrealsoul007

@ unrealsoul007这将只合并一个特定的提交吗?因此,要从B拉到E,命令应该是git merge <commit_hash C> <commit_hash D> <commit_hash E>对吗?
Wim Feijen

7
@WimFeijengit merge EE与其所有祖先合并(C并且Dgit知道这一点,A并且B不需要合并,因为它们已经在您的分支中了)。如果您只想更改,E则应git cherry-pick E改为。
neXus

谢谢你们的回答,我一直在寻找相同的问题。
Akash Bisariya

24

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

git fetch origin

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

git checkout origin/master
git log

抓住您要合并的提交的提交哈希(或只是它的前5个字符),然后将该提交合并到master中

git checkout master
git merge <commit hash>

1
我否决了您的意见,因为这与广告宣传不符。首先,使用“ git fetch origin”方法,它会获取所有远程分支(应该明确指出,尤其是对于有许多分支的项目工作的人)。其次,如果您返回历史记录,则使用此方法“ git merge <commit hash>”不会将您的本地历史记录合并到所需的提交中。示例:您在本地处于提交100,您希望通过获取所有内容(远程HEAD为100)来达到150。
占位符'18

8
@占位符,您应该git fetch在写此类废话之前阅读手册。除此之外,您应该阅读原始问题和我的答案。如果您遵循我的回答,那么您将不会像我明确指示用户那样“恢复历史” git checkout master。总体而言,如果您不清楚自己的工作至少50%,请不要发布任何内容。
developerbmw

1
万一对其他人不那么明显,则git fetch origin显式地获取origin
Daniel Farrell

2
这完美地工作,并且比接受的答案更好地解释了。
沃伦

1
最佳答案,
做得

14

您还可以拉最新的提交,然后撤消直到您需要的提交为止:

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

替换master为所需的分支。

使用git log查看您要还原到的提交:

git log

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

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

优点:如广告所示。您不必使用提交哈希或拉出不需要的分支。

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

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


3
我不知道为什么不赞成投票,这似乎是最干净的方法,而您想要起床时只需执行一次简单的下拉即可,这与其他一些答案不同
Mauricio Pasquier Juan

要么不为什么不进行更多投票,唯一的缺点就是您需要HEAD先退一步,而如果您必须解决冲突,我不知道会发生什么。但是此解决方案允许git pull --rebase,并且与所说的相反,您可以使用来直接重置回N提交git reset --hard HEAD~N(即3次提交git reset --hard HEAD~3)。
股票Overflaw

您可以执行此操作git reset --hard SHA,它将重置为所需的提交,而无需倒数。
维西亚2015年

2

如果将提交合并到分支中,则应该获取所有历史记录。

观察:

$ git init ./
在/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'添加字母'
[mastere 790eade]加字母
 更改1个文件,插入1个(+)
$ git日志
提交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”。

您处于“分离头”状态。您可以环顾四周,进行实验
更改并提交,您可以放弃在此所做的任何提交
状态,而不会通过执行另一个结帐来影响任何分支。

如果您想创建一个新分支来保留您创建的提交,则可以
(现在或以后)通过再次将-b与checkout命令一起使用来执行此操作。例:

  git checkout -b new_branch_name

HEAD现在位于7126e6d ...添加字母
$ git checkout -b B 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
切换到新的分支“ B”
$ git pull 790eade367b0d8ab8146596cd717c25fd895302a
严重的:'790eade367b0d8ab8146596cd717c25fd895302a'似乎不是git存储库
致命:无法从远程存储库读取。

请确保您具有正确的访问权限
并且存储库存在。
$ git merge 7f77979efd17f277b4be695c559c1383d2fc2f27
正在更新7126e6d..7f77979
快进
 信| 2 ++
 更改1个文件,插入2次(+)
$猫字母
一种
b
C
d

1

我从该视频中找到了更新的答案,接受的答案对我不起作用。

首先使用git clone <HTTPs link of the project> (或使用SSH)从git(如果还没有)克隆最新的仓库, 然后使用转到欲望分支 git checkout <branch name>

使用命令

git log

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

git fetch origin <Copy paste the shal here>

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

git checkout FETCH_HEAD

现在,特定的提交将对您的本地用户可用。更改任何内容,然后使用推送代码git push origin <branch name>。就这样。查看视频以供参考。


0

这对我有用:

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^`
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.