假设有4个文件A、B、C和D,其中文件A、B、C在主分支上提交。
我现在创建一个新的分支(称之为子分支(,执行git checkout sub-branch
并进行更改,然后只提交文件D。
但是,当我通过运行git push -u origin sub-branch
将文件D上提交的更改推送到远程存储库(Github(时,甚至文件A、B、C的提交也会添加到该分支中。
我只希望在文件d上提交的更改反映在新创建的分支中,我该如何实现这一点?
分支只是指向提交的指针。假设分支main
包含以下提交:
X-A-B-C
并且main
指向提交C
。当您创建新分支时,您从main
开始,这相当于从提交C
:开始
git switch -c sub-branch main
# since main points to C this is the same as
git switch -c sub-branch C
相反,听起来你只需要从以前的提交中创建新的分支:
git switch -c sub-branch X
如果你这样做的话,sub-branch
最终会变成X-D
。由于您已经创建了分支,您可以通过将其重置回X
并选择D
:来修复它
git switch sub-branch
git reset --hard X
git cherry-pick D
但是,提交已经被推送到远程主分支。
新的分支将包括一个提交,只对D.进行更改
然而,它的父提交将来自分支主(以及在此之前的父提交(
这就是提交链:有向无环图(DAG(
当我创建一个从分叉回购的分支到原始回购的主分支的PR时,它显示4个文件被更改,而不是1个。
这可能是因为目标分支还没有这些文件。
如前所述,git log --oneline --graph --decorate --all --branches
将显示该图。
我想知道如何获得X 的哈希
您也可以使用git merge-base
:
git merge-base main sub-branch
有几个选项:
- 从远程签出(假设提交尚未被推送(
- 在主目录中进行更改A、B、C之前先签出分支,然后在新创建的分支中进行更改D
- 在进行更改A、B、C
git checkout -b <new_branch_name> <sha1>
之前从特定提交签出
在签出到新分支之前,请确保所有更改都已提交。
如果您不想提交,请重置或隐藏您的更改。
这将解决你的问题。
现在,如果您在分支D中提交任何内容,它将只推送这些更改。