我已经设置了 git 供自己使用 - 因此我可以从“任何地方”访问一个项目,并且如果我碰巧在这里处理 X 部分和 Y 部分,则可以保证版本的安全,并可以在必要时进行合并。
但是,我的开发机器中只有一台有静态 IP。我的大脑卡在 CVS 模式,所以我尝试设置 git,让那台机器成为“中央”服务器,其他所有机器都从该服务器提取数据。
这类工作。我有一堆机器 AC,它们从“主” M 执行 git-pull。它们执行 git push 以将数据发回。
如果我在主服务器上进行开发,就会出现问题。首先,如果不执行以下代码,我不知道如何让中央仓库提供最新版本:
git reset --hard HEAD
这似乎有点过分。如果我在重置之前在中央机器上进行开发,我不确定如何将其与已经推送的更改合并。
我的思维模型有些问题。帮忙吗?
答案1
您希望您的中央存储库是裸露的。假设它所在的机器名为static
:
$ ssh static git init --bare /git/myproject.git
这个裸存储库是一个中心会合点:它用于推送和拉取,而不是开发。
在中央存储库的克隆上进行开发:
$ cd ~/src
$ git clone static:/git/myproject.git
即使您在 上static
,也可以在克隆中工作:
$ git clone /git/myproject.git
尽管你是唯一一个在这个存储库上工作的人,但要养成按照 git 文档要求的方式进行工作的习惯主题分支这样做的一个直接好处是,它保留了清理大师,也就是说,您可以随时从中央主分支拉取到当前本地存储库的主分支中,而无需进行合并。
例如:
$ git checkout -b fix-bug-in-foo
$ hack
$ git add file.c file.h
$ git commit -m "Fix ..."
这看起来可能不是什么大事,但它给了你离开项目的自由如该分支所示处于部分成熟状态,或者如果您的酷想法最终失败了,您可以轻松丢弃该分支,而不会破坏项目中已在其他分支上运行的任何其他内容。无限次自由重试!
也许你那天晚上回家后添加了一个新功能。第二天早上,你
$ git checkout master
$ git pull
更新本地主版本以反映中央存储库中的内容。
但现在假设你已经修复了 foo 错误并准备将其包含在你的 master 分支中。首先,你要将其与昨晚的更改集成:
$ git checkout fix-bug-in-foo
$ git rebase master
该rebase
命令使您的存储库看起来就像您在昨晚的新功能之上修复了 foo 错误一样。(这有点像svn update
,但更灵活和强大。)
现在将它放入你的中央主机:
$ git checkout master
$ git merge fix-bug-in-foo
$ git push origin master
我们一直将 master 视为特殊,但这只是惯例。您可以static
同样轻松地通过 git 存储库共享不同存储库的不同分支上的工作。
答案2
如果如果您有一台带有中央 git 存储库的中央服务器,那么该存储库应该是一个bare
存储库。裸存储库中没有文件的工作副本。因此,如果您在该中央机器上工作,则您不会直接使用中央存储库,而是使用本地克隆。
答案3
这个答案类似于gbacon 的答案,但采用的方法是您已经拥有本地存储库设置,并希望创建一个被视为中央存储库的远程主存储库。这只是从不同的方法中添加细节。
我使用 git 来存储我的 dot-config 文件。我从我认为的“中央存储库”中推送和拉取文件。通过多台计算机重置我的所有 dot 文件非常方便。
$ ssh example.com
$ mkdir dotconf.git && cd dotconf.git
$ git init --bare
$ exit
这会在 repo 站点上创建了一个空的裸 repo。
现在,如果我本地已经有现有的 repo,我可以将其推送到远程站点。
$ cd ~/src/dotconf
chdir 进入本地目录。
$ git remote add origin ssh://example.com/~/dotconf.git
将远程存储库添加为原点,因此推送/拉取将对该存储库进行操作。
$ git push origin master
将我的主控推送到原点(如之前通过 git remote 标记的一样)。现在,远程仓库被视为我的“中央仓库”。我的所有 git push/pull 都将与原点交互。
如果我转到另一台主机,我可以轻松地通过克隆该 repo 将其拉到新位置。
$ git clone ssh://example.com/~/dotconf.git
如果我想在远程服务器上进行开发,我会先克隆,然后将其推/拉回到裸仓库。
$ cd ~/src
$ git clone ~/dotconf.git
$ cd ~/src/dotconf
* do coding *
$ git push
* check in from another location *
$ git pull
您可能需要设置您的,git config --add branch.master.remote origin
这样git pull
就不会抱怨您不够具体。另一种选择是将您的主分支设置为--track
远程源。如果您有多个分支,这很有用。
答案4
我今天刚刚研究了同样的问题。这个博客邮政关于这个问题有很多讨论,但大多数人的意见是按照 Manni 所说的去做。查看 David French 的帖子下的评论,了解其他一些可能性,包括如果您最终错误地将工作推送到索引或工作树中未提交工作的存储库,该怎么办。“git reset –soft HEAD^”将撤消已推送的更改,而不会干扰您的工作。