使用git remote / master同步不同的本地更改

时间:2013-11-09 08:30:03

标签: git github

我有一个远程仓库和一些可以从遥控器pullpush的计算机。两个盒子上的版本经常发生分歧 - 我想知道当这些本地版本和远程/ master版本分歧时是否可以将本地更改合并到master

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

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

还有一些剪切和粘贴(通常在编辑时很小,所以它不会太累赘)。

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

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

提前致谢

1 个答案:

答案 0 :(得分: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来保存work-dir工作,这样就可以轻松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 laptopbranch.master.merge refs/heads/master;并在笔记本电脑上执行相同操作,但remotedesktop。这会让我自动化 - 并在此帖子中至少,我想展示潜在的机制,所以我想要任何自动化。)

你在桌面上已经完成了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和commit上做了更多工作,提前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

Voila,当我重新定位时,git设法做正确的事情(没有合并冲突或任何事情,结果有效等),我又回到了线性序列。

在更复杂的项目中,我可能会在某个时候决定重构一堆提交并使其变得混乱,然后我可能会使用git reset --hard。但后来我需要知道我正在做什么,以及哪台机器有哪些提交。我必须确保无论我在哪里工作(台式机,笔记本电脑,无论如何)我都fetch编辑了所有其他工作站点,并整合了所有“想要的”提交。重构 - 合并提交,在rebase -i中应用“fixup”等等 - 如果我忘记首先提交所有提交,将会给自己带来困难。

如果我是唯一一个在这方面工作的人(并且只使用两个或三个系统),那就不算太糟糕了;但如果它是一个共享项目,我必须确保我不会为其他人搞砸 - 特别是如果我使用push repo来转移对象,有时候故意push -f重写“转移”回购的分支。