这是我的设置......
笔记本电脑(Mac) - svn存储库的git克隆
拇指驱动器 - 笔记本电脑git存储库的git克隆
服务器(Win Server 08) - 拇指驱动器存储库的git clone
由于某种原因,我无法保持同步......
如果我在服务器上进行更改,我会在拇指驱动器上执行"git pull"以获取更改.将拇指驱动器带到笔记本电脑上并在笔记本电脑上进行"git pull".从那里,我可以做"git svn dcommit",一切都进入SVN回购没有问题.
如果我使用"git svn rebase"从SVN中取出更改,然后拉动到拇指驱动器并执行"git status",它表示我在主/源之前的##版本,我无法弄清楚为什么.
服务器
>git remote show
origin
>git remote show origin
* remote origin
Fetch URL: E:/proj
Push URL: E:/proj
HEAD branch: master
Remote branch:
master tracked
Local ref configured for 'git push':
master pushes to master (local out of date)
Run Code Online (Sandbox Code Playgroud)
笔记本电脑
>git remote show
(nothing)
>git remote show origin
fatal: 'origin' does not appear to be a git repository
fatal: The remote end hung up unexpectedly
Run Code Online (Sandbox Code Playgroud)
拇指驱动器
>git remote show
origin
>git remote show origin
* remote origin
Fetch URL: /Users/me/ui/proj
Push URL: /Users/me/ui/proj
HEAD branch: (unknown)
Remote branch:
master tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
Run Code Online (Sandbox Code Playgroud)
像pull这样的Git命令实际上不能用于rebase.
让我们说在你的笔记本电脑上,你有一些不在svn中的提交,并且拇指驱动器是同步的.像这样的东西:
laptop:
svn1 -- svn2 -- A -- B -- C -- D
thumb drive:
svn1 -- svn2 -- A -- B -- C -- D
Run Code Online (Sandbox Code Playgroud)
然后,你做git svn rebase从svn获取新东西.这有两个步骤:
laptop (after fetching from svn)
svn1 -- svn2 -- svn3 -- svn4
\
+ A -- B -- C -- D
Run Code Online (Sandbox Code Playgroud)
现在我们必须将你的git工作放在新的svn提交之上,所以我们仍然有非分支的历史记录.这是rebase的一部分:
laptop (after git svn rebase)
svn1 -- svn2 -- svn3 -- svn4 -- A' -- B' -- C' -- D'
Run Code Online (Sandbox Code Playgroud)
现在,如果没有冲突,提交A'包含与旧提交A相同的更改,唯一不同的是它的祖先:svn4而不是svn2.由于历史是git中每个提交的一部分,因为git A和A'是不同的提交.
所以在你git pull从笔记本电脑回购到拇指驱动器回购之后,git做了它自然的事情,这是合并新的变化:
thumb drive (after git pull)
svn1 -- svn2 -- svn3 -- svn4 -- A' -- B' -- C' -- D'
\ \
+ A -- B -- C -- D -------------------- merged result
Run Code Online (Sandbox Code Playgroud)
这在git中完全有意义,因为它允许它跟踪非线性环境中的所有更改,并记录谁进行了合并以及如何进行.但是,您将无法将此类历史记录提交给svn.
如果你强制推动你的拇指回购改变,你最终得到这样的东西:
thumb drive (after forced push)
svn1 -- svn2 -- svn3 -- svn4 -- A' -- B' -- C' -- D'
Run Code Online (Sandbox Code Playgroud)
如果您没有对拇指驱动器回购进行任何更改,这是完全正常的.如果你这样做,这将覆盖它们.要保持拇指驱动器更改,您必须在那里再做一次git rebase.
我要说的是,为了充分利用git,你必须放弃将你的工作投入svn的能力.没有简单的方法可以同时拥有分布式版本控制和线性历史记录.
| 归档时间: |
|
| 查看次数: |
478 次 |
| 最近记录: |