我想执行 git pull
,但只拉取至特定提交记录。
A->B->C->D->E->F (Remote master HEAD)
假设我的local master
指向B
,我想要拉取到E
,该怎么做?
这不是拉取特定的提交,而是拉取到特定的提交。
git pull
就是先执行 git fetch
,再执行 git merge
。因此你可以这样做:
git fetch remote example_branch
git merge <commit_hash>
git merge E
将合并E
以及其所有祖先C
和D
(Git知道A
和B
不需要合并,因为它们已经在你的分支中)。如果你只想要E
的更改,那么你应该使用git cherry-pick E
。 - neXusgit pull [remote] [remote-branch-or-commit]:refs/remotes/[remote]/[branch]
例如,git pull origin b78741a5:refs/remotes/origin/develop
将会将您的远程分支 develop
的本地引用更新为远程提交哈希值 b78741a5
。 - Radon8472首先,从远程仓库获取最新的提交。这不会影响您本地的分支。
git fetch origin
然后检出远程跟踪分支,并使用git log查看提交记录
git checkout origin/master
git log
获取你想要合并到主分支的提交哈希值(或只获取前 ~5 个字符),然后将该提交合并到主分支中。
git checkout master
git merge <commit hash>
git fetch origin
明确地获取 _origin_。 - erik258你也可以拉取最新的提交,并撤消操作,直到你想要的提交为止:
git pull origin master
git reset --hard HEAD~1
请用您想要的分支替换master
。
使用git log查看您希望还原到哪个提交:
git log
个人而言,这种方法对我更有效。
基本上,这个方法是获取最新的提交,并手动逐个还原提交。使用 git log 来查看提交历史记录。
优点:像广告宣传的那样工作。您不必使用提交哈希或拉取不需要的分支。
缺点:您需要逐个还原提交。
警告:提交/存储所有本地更改,因为使用--hard
将导致丢失它们。 自行承担风险!
HEAD
- 如果你需要解决冲突,我不知道会发生什么。但这个解决方案允许使用git pull --rebase
,并且与所说的相反,你可以直接重置到N
个提交之前,使用git reset --hard HEAD~N
(例如,对于3个提交,git reset --hard HEAD~3
)。 - Stock Overflawgit reset --hard SHA
命令将代码库重置到想要的提交状态,无需倒数计数。 - Visyagit 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^`
git pull origin E
。这样做的一个巨大优势是你不会拉取(也不会存储)不需要的历史记录。虽然我没有尝试过,但在执行获取和合并步骤后,你应该能够通过执行 git reset --hard E
来丢弃那些“未来的历史记录”。 - RJVB我从这个视频中找到了更新的答案,原来被接受的答案对我没用。
如果还没有的话,首先使用以下命令从git中克隆最新的repo(或者使用SSH):git clone <项目的HTTPs链接>
,然后使用以下命令切换到所需的分支:git checkout <分支名称>
。
使用以下命令:
git log
查看最新的提交记录。 复制特定提交的哈希值。然后使用以下命令:
git fetch origin <Copy paste the shal here>
git checkout FETCH_HEAD
现在,这个特定的提交将可用于您的本地。更改任何内容并使用 git push origin <分支名称>
推送代码。就这些。
参考视频:点击这里。
git checkout -b <new_branch_name> <commit_hash>
$ git init ./ 在 /Users/dfarrell/git/demo/.git/ 中初始化了一个空的 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
添加信件
commit 7f77979efd17f277b4be695c559c1383d2fc2f27 Author: Dan Farrell Date: Thu Jul 16 14:21:24 2015 -0500
添加信件
commit f2458bea7780bf09fe643095dbae95cf97357ccc Author: Dan Farrell Date: Thu Jul 16 14:21:19 2015 -0500
添加信件
commit 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad Author: Dan Farrell Date: Thu Jul 16 14:20:52 2015 -0500
添加信件
commit 6e59e7650314112fb80097d7d3803c964b3656f0 Author: Dan Farrell Date: Thu Jul 16 14:20:33 2015 -0500
初始信件 $ git checkout 6e59e7650314112fb80097d7d3803c964b3656f $ git checkout 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad 注意:您处于“分离的 HEAD”状态。您可以四处看看,进行实验性更改并提交它们,也可以在此状态下放弃您所做的任何提交,而不会影响任何分支。
如果您想创建一个新分支以保留您创建的提交,则可以使用带有 checkout 命令的 -b(现在或以后)。例如:
git checkout -b new_branch_name HEAD 现在位于 7126e6d... 添加信件 $ git checkout -b B 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad 切换到新分支 'B' $ git pull 790eade367b0d8ab8146596cd717c25fd895302a 致命:'790eade367b0d8ab8146596cd717c25fd895302a' 不似乎是 Git 存储库 致命:无法从远程存储库读取。
请确保您具有正确的访问权限并且存储库存在。 $ git merge 7f77979efd17f277b4be695c559c1383d2fc2f27 更新 7126e6d..7f77979 快进 letter | 2 ++ 1 file changed, 2 insertions(+) $ cat letter a b c d
git log
用于检查本地分支与其他分支之间的差异
git log
git merge cuY2324X
然后通过切换到其他分支,在其中检出要将代码推送到特定提交的分支,使用至少6位提交来执行git merge
。
简单明了
git pull origin <Commit-hash>
git fetch
和git merge E
:git fetch
:从远程仓库获取最新的代码和分支,但不会将它们合并到本地分支中。git merge E
:将名为E的分支合并到当前所在的本地分支。