让我们以我现在遇到的这个案例为例:
$ git log --decorate
commit A (HEAD -> dev)
commit B
commit C
commit D
commit E
commit F (origin/dev)
现在,如果我想推到HEAD,因为我已经做了--set-upstream
,我可以git push
.
就我而言,我想推动dev
,但只能提交C
,因为我经常修改/挤压/改写我最近的几个提交。我可以做git push origin C:dev
,但是鉴于我已经设置了dev
分支来跟踪origin/dev
,难道没有一种不那么冗长的方法吗?即,有没有办法让我不必指定远程和分支,但仍然推送到某个提交?
我可以做 git
......push origin C:dev
,但不是没有一种不那么冗长的方法
不是那么冗长,但也许更容易。1我假设您C
是指提交C
的哈希 ID。 您还可以做其他事情。 根据你喜欢的工作方式,你可能会发现这更好,或者不是。 请参阅脚注下方的部分。
当像这样使用语法git pushremoterefspec
时,对于包含文字冒号:
字符的refspec
参数,refspec 参数左侧的内容可以是选择所需提交的任何内容。 原始哈希 ID 效果很好,但相对名称(如HEAD~2
或dev~2
(也是如此,您可以将完整的哈希 ID 缩写为短至四个字符,只要它唯一标识对象即可。
gitrevisions 文档中列出了命名任何给定提交的所有可能方法的完整列表。
1这取决于你觉得容易什么,以及你如何计算"冗长"。 原始哈希 ID 是 40 个字符,dev~2
是 5 个字符,所以显然dev~2
更短,但在某种程度上它更详细:它有三个单词,dev
、~
和2
。 计数也可能很棘手,当你有几个可靠的提交时,你想推动几十个或几百个摇摆不定的提交,你想避免推送 - 剪切和粘贴原始哈希ID在这里可能更好。
一个不同的,也许更好的工作流程
这里出现的问题是因为您正在处理一个已命名为dev
的分支,这是一种通用的。 相反,假设您有一个名为wobbly-feature-xyz
或wip/xyz
的分支,其中wip
代表正在进行的工作,并且是向组中每个人发出的信号,表明该分支将定期重写其历史记录,并且不应依赖其中的提交。 然后,您可以安全地将正在进行的、摇摆不定的提交保存在另一个 Git 中origin
(这可能更可靠并获得定期备份等(,知道没有人会像他们可能依赖dev
提交那样依赖它们。
这使您可以使用git rebase -i
随意编辑摇摆不定的分支的历史记录。 当你在那个摇摆不定的分支中有一些你觉得很可靠并且应该进入dev
的提交时,你可以把它们放在那里。
假设我们从你的 Git 和 Git 中的这个存储库开始,origin
,嗯,几乎是其他人:
...--A--B--C <-- master
D--E <-- dev
G--H--I <-- wip/xyz
您现在处理功能分支wip/xyz
而其他人处理其wip
功能分支。 Alice 决定一些提交已经完成并准备就绪,并将它们放入dev
因此在运行git fetch origin
之后,您的存储库现在具有:
...--A--B--C <-- master, origin/master
D--E <-- dev
|
| F <-- origin/dev
G--H--I <-- wip/xyz, origin/wip/xyz
现在,您可以随时快进dev
以选取新的提交:
...--A--B--C <-- master, origin/master
D--E--F <-- dev, origin/dev
G--H--I <-- wip/xyz, origin/wip/xyz
然后,也随时使用git rebase
复制三个 WIP 提交:
... G'-H'-I' <-- wip/xyz
/
D--E--F <-- dev, origin/dev
G--H--I <-- origin/wip/xyz
然后强制推动,因为每个人都同意这种事情发生:
...--D--E--F <-- dev, origin/dev
G'-H'-I' <-- wip/xyz, origin/wip/xyz
如果你现在觉得你的三个提交中的第一个非常可靠,你现在可以git checkout
你自己的dev
和快进合并,提交到其中:
...--D--E--F <-- origin/dev
G' <-- dev
H'-I' <-- wip/xyz, origin/wip/xyz
现在,您可以在dev
上git push
推送提交G'
,从而提供:
...--D--E--F--G' <-- dev, origin/dev
H'-I' <-- wip/xyz, origin/wip/xyz
除了现在允许(但没有义务(推送正在进行的提交之外,就所有其他 Git 存储库而言,这与你现在正在做的事情具有完全相同的效果。关键区别在于,存储库中dev
的标签会在更具体的时间在您的控制下向前移动,因此您永远不会在自己的dev
上进行"摇摆不定"的提交。
(这可能会(也可能不会(使您更容易跟踪您认为哪些提交是可靠的。