虽然我不使用 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
保存工作目录工作,以便可以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 上做了更多的工作并提交,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
等等——如果我忘记先把所有的提交都带过来,我自己会很困难。
如果我是唯一一个从事此工作的人(并且只使用两个或三个系统),那还不错;但如果它是一个共享项目,我必须确保我不会为其他人搞砸——尤其是如果我使用push
repo 来传输对象,有时会故意push -f
重写“transfer” repo 上的分支。