Git提交尚未完成,但无法在该机器上继续


11

有时,我遇到的问题是工作站上未提交代码,但尚未准备好提交但需要在其他工作站或笔记本电脑上完成。

是否有人可以解决此问题,例如“软提交”或将更改转移到另一台计算机以在其他地方使用的其他方法?

我希望不要被迫提交和推送未正确实施的更改。


2
这篇文章很难阅读(文字墙)。您介意将其编辑为更好的形状吗?
2014年

..听起来就像你在追求git stash...?
西蒙·怀特海德

@SimonWhitehead是的,但是我可以轻松地将git隐藏到另一台机器上吗?
csteifel 2014年

所有的 Git提交都是“软提交”。
user253751 '17

并不是真正的重复,因为它以另一种方式解决了问题,但与此相关:我是否应该使用git stash保存项目的正在进行的更改并将其推送到github以便在其他计算机上访问?
试试,最终

Answers:


12

以下假设您的本地存储库是另一个服务器(例如github)上存储库的克隆。并且您有权更改上游服务器。在我的示例中,我将此上游回购称为“来源”。运行git remote show以列出其他存储库,这可能会提示您有关它的名称。

我建议创建一个分支,然后您可以在另一台计算机上签出该分支。实际上,如果您在开始工作后立即建立分支,则可以“提交”到分支,对工作进行跟踪和备份,而不必具有稳定的代码集。对工作满意后,可以将其合并回“ master”分支。

  • 要分支您的仓库: git checkout -b MyNewBranch
  • 推送新分支的已提交更改: git push origin MyNewBranch
  • 要检出另一台计算机上的分支: git checkout MyNewBranch
  • 切换到另一个分支(例如“ master”): git checkout master
  • 在母版中时,要合并MyNewBranch: git merge MyNewBranch
  • 列出分支: git branch

3
是的,始终在您自己的私人分支机构中工作基本上可以解决此问题。您可以根据需要进行多次提交,而不会影响其他任何人。更好的做法是,每当您开始使用新功能或开始修复新缺陷时都创建一个新分支。这使得在代码库之间来回跳转变得非常容易。
装填了机器人

另外,还有我这样做的原因:如果在途中犯了一个错误,则可以转到当前分支上的先前提交。或者,跳回去,抓住其中的一部分,向前跳并申请。
AMADANON Inc. 2014年

1
此方法是否还会在合并的master分支中包含未完成的提交?
eimrek '16

是的,(在我看来)这可能不是一件坏事。如果您不希望这样做,请执行上述操作,然后不要提交代码,而是创建一个diff(包括所有文件更改,但不提交),将其应用于分支的新副本,然后进行推送。
AMADANON Inc.

2
关于“ 切换到另一个分支做git branch -d master ”,我很困惑,是不是要求git 删除 master分支?(无论如何,这都是我从阅读git分支手册获得的印象)
Tasos Papastylianou

2

您可以git diff用来创建补丁,然后将其应用到其他计算机上。或者,您可以创建一个临时提交,然后将其从其他计算机中拉出。您甚至可以在其他计算机上创建一个临时分支,将您的临时提交推送到那里,然后删除该分支。

我最喜欢的方法是第二种方法:创建一个临时提交,然后转到另一台计算机并执行以下操作:

$ git fetch ssh://first_machine/path/to/repo whatever_branch_i_was_working_on
$ git reset --hard FETCH_HEAD
$ git reset HEAD^

为什么如此复杂,而不仅仅是使用git format-patch
试试,最终

并没有什么不同git diff。有什么我想念的吗?
aragaer

1
git format-patch deadbee..badcab1e-它.patch为每个提交分别创建文件,并保留漂亮的名称和提交消息。
试试,最终

它还会为尚未提交的更改创建补丁吗?它是否将当前索引和尚未上演的内容分开?看起来好像没有。
aragaer

不,不是针对未提交/未暂定的更改。但是,由于只要您不推动就不会损害其他任何人,因此可以进行提交(带有“ WIP”的明确信息-正在进行中)。
试试,最终

2

提交。我送到个人分支,在另一侧签出并修改。并在完成后删除个人分支。

当然,您可以直接在存储库之间进行推送,可以使用bundle或format-patch/ am,但是到目前为止,最简单的解决方案是使用个人分支。只要不将历史推送到任何共享分支,重写历史记录就没什么大不了的。在许多项目中,人们应该倒带功能分支,以使它们更易于理解以进行审查。


0

一种简单的方法就是您描述的一种方法:将.git隐藏的目录和项目文件复制到另一台计算机上,您可以在其中提交并完成操作,也可以继续工作。

.git目录是您保存git历史记录的位置,因此将其与实际文件一起保存可保持整个项目历史记录不变。

如果永久使用原始计算机完成操作,则可能会推荐这种方法。


0

就像其他人回答的那样,使用Git,您不必关心个人分支中未完成的代码。但是,如果由于某种原因,您真的真的不希望您未完成的工作触及主仓库,则可以利用Git的分布式特性!

有一个名为的简单工具git bundle,可以帮助您轻松地进行更改而无需中央存储库。首先,克隆仓库:

git clone https://github.com/octocat/Spoon-Knife.git working_copy_1
cd working_copy_1

进行一些更改并将它们提交到临时分支:

git checkout -b tmp_branch
git commit -a -m "temporary changes"

现在,将它们的更改捆绑在一起:

git bundle create ../tmp.bundle tmp_branch

现在,您有了一个捆绑文件,可以将其邮寄到新计算机。您在那里如何使用它?让我们创建一个新的工作副本:

cd ..
git clone https://github.com/octocat/Spoon-Knife.git working_copy_2
cd working_copy_2

我们需要将捆绑软件视为另一个远程设备,以便从中获取更改

git remote add tmp ../tmp.bundle
git fetch tmp

因为整个要点是转移更改而不会留下痕迹,所以我们希望将它们压缩到工作副本中,以丢失临时提交:

git merge tmp/tmp_branch --squash

剩下的就是删除临时遥控器:

git remote remove tmp

小提琴!所做的更改已转移到新的工作副本中,而没有留下分支和提交的痕迹!

但确实-这个过程相当漫长且繁琐。这是Git,而不是SVN-确实没有任何理由不将您的个人分支推到中央仓库。

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.