0

我有一个远程仓库和几台可以pull远程访问的计算机push。两个盒子上的版本经常出现分歧——我想知道master当这些本地版本和远程/master版本分歧时,是否可以将本地更改合并到一个?

push在开始使用桌面上的版本之前,我经常忘记从笔记本电脑到遥控器,目前我很不情愿地解决了这些问题:

git fetch --all
git reset --hard origin/master

还有一些剪切和粘贴(它通常发生在编辑很小的时候,所以不会太繁琐)。

想做的是将滞后版本与遥控器上的版本合并。

我确信这是可能的,但我无法弄清楚(我发现的在线帮助假设您有一个链接到回购的盒子 - 不是两个不同的版本和一个回购)。

提前致谢

4

1 回答 1

1

虽然我不使用 github,但我在自己的系统上做这种事情。有很多不同的方法来处理它。

假设您有一台笔记本电脑和一台台式机,并且两者都使用。你可以:

laptop$ git remote add desktop ssh://desktop.host.name/...

和:

desktop$ git remote add laptop ssh://laptop.host.name/...

现在在任一系统(带有非裸仓库)上,您都可以git fetch laptopgit fetch desktop根据需要。有时您需要从一个到另一个 ssh 并git commit保存工作目录工作,以便可以fetch轻松编辑它。因此,您在桌面上并意识到您还没有从笔记本电脑上完成工作。 ssh laptop并在需要时提交,然后git fetch laptop. 现在您laptop/branch的桌​​面上有了,可以git mergegit cherry-pick或做任何您想做的事情。(您可能必须先打开笔记本电脑的电源。:-))

或者,假设您有一个名为 的远程裸“共享”存储库origin,并且您在桌面上并意识到您忘记从笔记本电脑推送。只需 ssh 到笔记本电脑,如果需要,提交git push到裸仓库,然后从桌面“git fetch”将其恢复。它有点往返,但结果是一样的,它只是被命名origin/branch而不是laptop/branch.


编辑:这里有几个常见的场景(刚刚组成,在飞行中,所以不是很复杂)。注意,“lola”(在下面重复出现)是一个别名:

$ git config --get alias.lola
log --graph --decorate --oneline --all

(另请注意,我没有将台式机和笔记本电脑系统设置为彼此作为“跟踪”分支。我在“全手动模式”下做所有事情。我可以在桌面上进行配置,branch.master.remote laptop然后branch.master.merge refs/heads/master做在笔记本电脑上也一样,但remote存在desktop。这会给我带来一些自动化——至少在这篇文章中,我想展示底层机制,所以我想要任何自动化。)

你在桌面上并且已经cd project开始工作,并且已经开始寻找并意识到:哦等等,我在笔记本电脑上提交了一些我想在这里拥有的东西。我正在分支上工作master(这是一个新项目,还没有其他分支)。

所以:

desktop$ git fetch laptop
remote: Counting objects: 4, done.
[snip]
desktop$ git lola
* d824ebf (laptop/master) work done on laptop
* 176af7a (HEAD, master) initial

这里laptop有一个我没有的提交。如果我有一些我想保存的工作,我可能会使用git stash(尽管还有其他选项)。在这种情况下,我什至还没有开始工作,因为我注意到 foo.py 丢失了。

desktop$ git merge laptop/master
Updating 176af7a..d824ebf
Fast-forward
 foo.py |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 foo.py

现在笔记本电脑和台式机是同步的(虽然机器“笔记本电脑”不知道!)。我在 foo.py 上做了更多的工作并提交,desktop继续前进。

后来,回到笔记本电脑上,我这样做:

laptop$ git fetch desktop
remote: Counting objects ...[snip]
$ git lola
* 968cf90 (desktop/master) main: fix stupid bug
* b8a9735 add main
* 6289ce6 fix up foo
* d824ebf (HEAD, master) work done on laptop
* 176af7a initial

所以现在,如果我git merge desktop/master准备好在笔记本电脑上进行更多工作:

laptop$ git merge desktop/master
Updating d824ebf..968cf90
Fast-forward
 foo.py  |  8 +++++++-
 main.py | 21 +++++++++++++++++++++
 2 files changed, 28 insertions(+), 1 deletion(-)
 create mode 100644 main.py

如果我在笔记本电脑和台式机上都做过工作并且需要合并或变基,那就有点麻烦了。我可能会变基,当我能得到它们时,我喜欢我的线性提交历史:-):

desktop$ ... work, commit, etc
# oops, I forgot to bring over stuff from laptop!
desktop$ git fetch laptop
remote: Counting objects [snip]
desktop$ git lola
* 8f95602 (HEAD, master) describe
| * bd5d378 (laptop/master) hook up function
|/  
* 968cf90 main: fix stupid bug
* b8a9735 add main
* 6289ce6 fix up foo
* d824ebf work done on laptop
* 176af7a initial
desktop$ git rebase laptop/master
First, rewinding head to replay your work on top of it...
Applying: describe
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging main.py
desktop$ git lola
* dba0f92 (HEAD, master) describe
* bd5d378 (laptop/master) hook up function
* 968cf90 main: fix stupid bug
* b8a9735 add main
* 6289ce6 fix up foo
* d824ebf work done on laptop
* 176af7a initial

瞧,当我重新设置基准(没有合并冲突或任何东西,结果有效等)并且我回到线性序列时,git 设法做正确的事情。

在更复杂的项目中,我可能会在某个时候决定重组一堆提交并弄得一团糟,然后我可能会使用git reset --hard. 但是我需要确切地知道我在做什么,以及哪台机器有哪些提交。我必须确保,无论我在哪里工作(台式机、笔记本电脑等),我都fetch编辑了所有其他工作站点并合并了所有“想要的”提交。重组——合并提交,在 中应用“修复”rebase -i等等——如果我忘记先把所有的提交都带过来,我自己会很困难。

如果我是唯一一个从事此工作的人(并且只使用两个或三个系统),那还不错;但如果它是一个共享项目,我必须确保我不会为其他人搞砸——尤其是如果我使用pushrepo 来传输对象,有时会故意push -f重写“transfer” repo 上的分支。

于 2013-11-09T09:36:34.373 回答