让我说当我从develop创建一个功能分支f
时,我有一个这样的提交树的本地存储库:
master --> a
\
\
develop c
\
\
feature f
现在有一段时间新功能被合并以开发c
,我的提交树看起来像这样:
master --> a
\
\
develop c --> d --> e
\
\
feature f
现在我想确保在从开发中提取最新更改之前我没有提交。
master --> a
\
\
develop c --> d --> e
\
\
feature f
根据我的尝试,一种方法是将更改推送到f
,然后尝试合并f
以开发e
(现在有新的更改)。这样做显然会从git中抛出错误消息,说发展在f
之前。我非常有信心可以使用post-hook
完成此操作。但是,我可以使用git pre-hook
吗?
如果是这样,如何做,如果没有,请提出其他一些方法。如果可能的话请解释一下命令在做什么?(我只是git的初学者)
要求是在用户尝试执行此操作时显示一些自定义消息。
提前致谢!!
更新 我正在研究一个看起来像这样的解决方案(稍后这个脚本将在预提交钩子中调用)
tomato.sh
#!/bin/bash
WORKING_GIT_DIR=$1
cd $WORKING_GIT_DIR
# switch to BRANCH_TO_MERGE
BRANCH_TO_MERGE=$2
git checkout $BRANCH_TO_MERGE
PARENT_BRANCH=$(git show-branch | grep '*' | grep -v "$(git rev-parse --abbrev-ref HEAD)" | head -n1 | sed 's/.*\[\(.*\)\].*/\1/' | sed 's/[\^~].*//')
echo $PARENT_BRANCH
# in memory merging of feature branch and parent and look for possible conflicts
git merge-tree `git merge-base FETCH_HEAD $PARENT_BRANCH` FETCH_HEAD $PARENT_BRANCH
如何投放
sh +x tomato.sh (PATH TO WORKING_GIT_DIR) (BRANCH_TO_MERGE)
脚本如何运作
它试图找到父分支(详见[here] [2])。 然后使用以下方式进行三向合并:
git merge-tree <base> <branch1> <branch2>
base - &gt;找到当前FETCH_HEAD&amp;的最佳共同祖先。当前父分支的父/最近父分支
branch1 - &gt;当前FETCH_HEAD
branch2 - &gt;当前父分支的父/最近父分支
这将为远程和本地分支提供内存合并,而不实际更改索引。
如果有人改进了此脚本,请发表评论。
提前致谢!
答案 0 :(得分:1)
现在我想确保在从开发中提取最新更改之前我没有提交。
这是不可能的,因为git中的提交是本地的
我认为你需要的是一个团队理解所有工作都是在推动之前重新开发。执行此操作将是代码审查。
可能是在CI中强制执行此操作的技术方法。
答案 1 :(得分:1)
正如已经指出的那样,普通的git对这样的事情没有任何特别的支持,这就是像pull request这样的概念被添加到git overlay解决方案(如github和bitbucket)以及像{{3}这样的工具的原因。促进组织政策的审查,访问等。
由于问题被标记为github,我假设您正在使用它,然后我会说您应该忽略本地功能分支的最新状态,并让开发人员推送他们分支的任何内容并创建拉取请求从那起。
如果功能分支落后,则拉出请求将显示,如果存在冲突 1 ,则无法合并。然后由功能分支开发人员离开球,并让他/她负责更新功能分支,以便将其合并到开发中。
1 这当然只能从自动逐行合并分析中确定,这可能无法检测到概念冲突。可以定义额外的gerrit,如果这是您想要的,我可以使用它来拒绝合并任何非最新的拉取请求。 更新:刚出现问题requirements。