我有一个远程仓库和一些可以从遥控器pull
和push
的计算机。两个盒子上的版本经常发生分歧 - 我想知道当这些本地版本和远程/ master
版本分歧时是否可以将本地更改合并到master
?
在我开始处理桌面版本之前,我经常忘记从笔记本电脑到遥控器push
,目前我不情愿地解决这些问题:
git fetch --all
git reset --hard origin/master
还有一些剪切和粘贴(通常在编辑时很小,所以它不会太累赘)。
我喜欢要做的是将滞后版本与遥控器上的版本合并。
我确信这是可能的,但我无法弄清楚(我发现的在线帮助假设你有一个与回购链接的盒子 - 不是两个不同的版本和一个回购)。
提前致谢
答案 0 :(得分:1)
虽然我不使用github,但我在自己的系统上做这种事情。有许多不同的方法来处理它。
假设您有笔记本电脑和台式机,并且两者都使用。你可以:
laptop$ git remote add desktop ssh://desktop.host.name/...
和
desktop$ git remote add laptop ssh://laptop.host.name/...
现在,在任一系统上(使用非裸仓库),您可以根据需要git fetch laptop
或git fetch desktop
。有时候你需要从一个ssh到另一个和git commit
来保存work-dir工作,这样就可以轻松fetch
。所以,你在桌面上并意识到你还没有从笔记本电脑中解决问题。 ssh laptop
并在需要时提交,然后git fetch laptop
。现在,您的桌面上有laptop/branch
,可git merge
或git 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和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
重写“转移”回购的分支。