我们最近从SVN切换到Git,同时将实时系统置于版本控制中(而不是将本地签出和文件复制实时化)。

在项目中,我被分配给我们所有人访问相同的存储库并要使更改生效,我们只需在这里git pull。这会导致问题,因为我们的Web设计人员将尚未生效的更改推送到了VCS中,但应该将这些更改发布到Web测试环境中。

当其中一名开发人员进入实时状态时,他得到了全部(可能未完成) )更改。

我想将活动切换到一个额外的分支,然后仅合并更改的内容,但是由于我缺乏git知识,所以我不知道如何更改。

我的想法是:


在线创建新分支(git branch live)。
每次必须上线的时候


在主服务器中拉动更改(例如:git checkout master; git pull; git checkout live
git merge master



问题是,切换到母版或直接将所有内容拉入实时系统都会引起问题,所以我更愿意避免这种情况。

有没有办法做到这一点,或者有什么更好的方法来管理Live系统(除了培训Webbie不要推送未完成的内容外)。

评论

git pull-默认情况下,all不会将master拉入live,它将拉master并将其与master合并,并且(如果服务器上已存在)将live拉并入live。你尝试过吗?

您的问题是否是由分支产生的,而该文件在进行实时分支并修改后又添加到git之前并未受到版本控制?这就是我以前发生的事情,通常应该足以临时重命名该文件,或者如果不需要实时重命名该文件,请使用git checkout -f忽略问题-但进行备份!

相关:stackoverflow.com/questions/3216360/…

我不确定这与stackoverflow.com/questions/3216360 / ...有什么关系-这表示这里存在明显的工作流程问题,我认为一个简单的解决方法是使用Fork / PR流程进行实时直播并提供给开发人员自己进行测试的能力。只有生产就绪型代码会在仓库中得到批准和合并(您确保批准者知道并正确过滤),而开发人员可以在自己的分支上进行提交和测试(无论如何,它们都是某种分支)。确保开发人员不能直接推送,必须通过PR /审查。

@ ThomasGuyot-Sionnest这个问题已有10岁,比例如高出4岁。 Gitlab。事情...不一样...那时

#1 楼

在另一个分支中工作时,我可以使用以下命令将更改从origin/master拉入master
git fetch origin master:master

要深入了解正在发生的事情,请查看此Stack Overflow问题的出色答案。对我而言,主要要点是该命令仅适用于快速合并。

评论


太棒了!正是我在寻找的东西-需要对此进行更明显的记录...

–马库斯牧羊犬
19年1月14日在9:22

您可以在以下位置找到有关此文档:git-scm.com/docs/git-fetch#_examples

–c1moore
19年2月8日在14:16

取!=拉

– D.Kovács
19年7月16日在7:21

这确实将指定的分支更新为上游分支。 👍

–sean
20年1月16日在7:15

如果不是快进,请添加-f,并且您要强制更新它:git fetch -f origin master:master

–迭戈
20年1月30日,11:37

#2 楼

您可以在检出母带并拉动之前使用git stash,然后在现场检出后再次使用git stash pop(或者如果您的git较旧,则假设您没有藏任何东西,请使用git stash applygit stash clear

评论


git pull --all将获取所有远程,但仍会尝试将一个分支(或默认分支)合并到当前分支中。

– mipadi
2010年7月15日在16:21

@mipadi是的,但是只有当前分支本身没有尝试结账master并引起冲突,不是吗?

– Tobias Kienzler
10年7月16日在6:13

它将合并配置为自动合并到当前分支的任何分支(如果已配置这样的分支)。

– mipadi
10年7月16日在6:26

@Superole记录为“获取所有远程”,它不仅包括多个存储库,还包括分支。虽然事后看来,git fetch-一切可能都是一个更好的答案

– Tobias Kienzler
13年7月25日在9:02

@TobiasKienzler它仅指示git从所有已配置的遥控器中获取。最常见的情况是只有一个远程命名起源。如果您碰巧有一个与您当前分支相同的远程分支,并且它们彼此之间不具有快进关系,则使用--all选项将为您提供该分支不同版本的章鱼合并进入当前!因此,我的建议是远离--all,除非您要这样做,否则在大多数情况下,它不会给您任何帮助。

–超极
13年7月25日在9:24

#3 楼

首先解决问题。他们不应该将其推向没有业务的分支。

您似乎要问的是类似

git checkout live
git pull origin master


这将尝试合并远程主服务器和活动分支。

评论


问题是我们目前只有一个分支,并且由于每个人都已经习惯了SVN并且不愿意学习新功能的优势,因此我们不可能真正改变这一分支。只能在实时目录中创建一个新分支。我要避免将远程主服务器合并到活动分支,因为我无法阻止任何人向主服务器推送调试代码,不完整的功能,语法错误和其他任何内容(毕竟我只是初级开发人员)。不过谢谢您的建议。

– Morfildur
2010年7月13日在14:16

@dbeme:您可以使用tarball和补丁。 ;)除非他们愿意学习git(并且分支和合并一点都不困难),否则您将遇到问题。

–乔什·K(Josh K)
2010年7月13日在15:52

#4 楼

我建议您为每个人创建一个测试git repo。所有存储库,包括您的实时网站,都将是测试存储库的副本。通过这种方式,任何人都可以进行测试,而无需访问实时网站。当有人需要更新实时站点时,则可以从git测试库中提取实时站点。此工作流程与SVN非常相似。为了获得更大的灵活性,我建议使用您描述的“实时”分支。

总而言之,每个人的git repo是测试库的克隆。现场制作站点也只是测试仓库的一个副本。或者,测试可以是实时产品的克隆,以便“ git push”始终向生产转移。

其他选项包括在此安排中添加“ live”分支或在两者之间添加“ staging”回购测试和生产。为了提高安全性,我建议限制对实时git repo的访问,并强迫人们使用安全的脚本来完成实时生产。

#5 楼

首先,请注意,如果您不直接提交,则实际上不需要master的本地副本。因此,解决问题的最简单方法是更改​​工作流程的这一部分:
git merge master


git merge origin/master

然后,您不必费心拉下本地分支。话虽这么说,但是如果您希望拥有本地副本,则从概念上更容易想到“更新母版”而无需先将其检出,这是这样的:
# delete your local master (normally either -d or -D should work here)
git branch -D master
# create a new copy of master from the remote copy
git branch master origin/master

还有一种更快的方法,因为您可以强制执行该操作并跳过删除操作:
# replace your local copy of master with it's remote version, even if it already exists
git branch -f master origin/master

显然,所有这些命令都假定您已经事先从最新来源获取了信息。如果不是,请先执行git fetch

评论


这不使用远程分支的存储副本,而不是实际的远程分支吗?从技术上讲,origin / master是代表远程分支的本地分支,但这并不意味着其与实际的远程是最新的。据我了解。

–基思·泰勒(Keith Tyler)
20-10-12在17:29

@KeithTyler正确。这就是最后一句话的原因。提取时,您将从实际的远程服务器更新副本。

– TTT
20-10-12在17:38