Git 拉直到一个特定的提交

我想做一个 git pull,但只有到一个具体的提交。

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

假设我的 local master头指向 B,我想拉到 E。我该怎么做?

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

305148 次浏览

如果您将一个提交合并到您的分支中,那么您应该得到。

观察:

$ git init ./
Initialized empty Git repository in /Users/dfarrell/git/demo/.git/
$ echo 'a' > letter
$ git add letter
$ git commit -m 'Initial Letter'
[master (root-commit) 6e59e76] Initial Letter
1 file changed, 1 insertion(+)
create mode 100644 letter
$ echo 'b' >> letter
$ git add letter && git commit -m 'Adding letter'
[master 7126e6d] Adding letter
1 file changed, 1 insertion(+)
$ echo 'c' >> letter; git add letter && git commit -m 'Adding letter'
[master f2458be] Adding letter
1 file changed, 1 insertion(+)
$ echo 'd' >> letter; git add letter && git commit -m 'Adding letter'
[master 7f77979] Adding letter
1 file changed, 1 insertion(+)
$ echo 'e' >> letter; git add letter && git commit -m 'Adding letter'
[master 790eade] Adding letter
1 file changed, 1 insertion(+)
$ git log
commit 790eade367b0d8ab8146596cd717c25fd895302a
Author: Dan Farrell
Date:   Thu Jul 16 14:21:26 2015 -0500


Adding letter


commit 7f77979efd17f277b4be695c559c1383d2fc2f27
Author: Dan Farrell
Date:   Thu Jul 16 14:21:24 2015 -0500


Adding letter


commit f2458bea7780bf09fe643095dbae95cf97357ccc
Author: Dan Farrell
Date:   Thu Jul 16 14:21:19 2015 -0500


Adding letter


commit 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Author: Dan Farrell
Date:   Thu Jul 16 14:20:52 2015 -0500


Adding letter


commit 6e59e7650314112fb80097d7d3803c964b3656f0
Author: Dan Farrell
Date:   Thu Jul 16 14:20:33 2015 -0500


Initial Letter
$ git checkout 6e59e7650314112fb80097d7d3803c964b3656f
$ git checkout 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Note: checking out '7126e6dcb9c28ac60cb86ae40fb358350d0c5fad'.


You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.


If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:


git checkout -b new_branch_name


HEAD is now at 7126e6d... Adding letter
$ git checkout -b B 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Switched to a new branch 'B'
$ git pull 790eade367b0d8ab8146596cd717c25fd895302a
fatal: '790eade367b0d8ab8146596cd717c25fd895302a' does not appear to be a git repository
fatal: Could not read from remote repository.


Please make sure you have the correct access rights
and the repository exists.
$ git merge 7f77979efd17f277b4be695c559c1383d2fc2f27
Updating 7126e6d..7f77979
Fast-forward
letter | 2 ++
1 file changed, 2 insertions(+)
$ cat letter
a
b
c
d

git pull就是 git fetch后面跟着 git merge所以你能做的就是

git fetch remote example_branch

git merge <commit_hash>

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

git fetch origin

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

git checkout origin/master
git log

获取您想要合并到的提交的提交散列(或者仅仅是它的前5个字符) ,并将该提交合并到 master 中

git checkout master
git merge <commit hash>

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

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

用所需的分支替换 master

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

git log

就我个人而言,这对我更有效。

基本上,这样做是拉最新的提交,您手动恢复提交一个接一个。使用 git 日志查看提交历史记录。

优点: 和广告中说的一样有效。你不需要使用提交散列或者拉出不需要的分支。

缺点: 您需要将提交恢复为1。

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

这对我有用:

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。它允许在您的 gitconfig 中使用 pull-rebase 和 honerpull 设置。这个方法很有效,因为你基本上把28eb00当成了一个分支。

对于我使用的 git 版本,这个方法需要一个完整的提交散列-不允许使用缩写或别名。你可以这样做:

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

我已经找到了来自 这个视频的更新答案,接受的答案不适合我。

首先使用 git clone <HTTPs link of the project> (或使用 SSH)然后使用 git checkout <branch name> .

使用命令

git log

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

git fetch origin <Copy paste the shal here>

按下回车键后,现在使用命令

git checkout FETCH_HEAD

现在,特定的提交将可用于您的本地。更改任何内容并使用 git push origin <branch name>推送代码。仅此而已。 检查 视频作为参考。

git log检查本地分支和其他分支之间的差异

  git log
git merge cuY2324X

然后通过签出到其他分支(您希望在其中将代码推送到特定提交并使用至少6位数字的提交) ,将 git merge推送到特定或特定提交

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

git checkout -b <new_branch_name> <commit_hash>

简单明了

git pull origin <Commit-hash>