可以說,我有這樣的承諾樹下面的本地存儲庫,當我從開發創建了一個特性分支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的初學者)
要求是顯示一些自定義消息,以防用戶嘗試這樣做。
在此先感謝!
更新: 我上看起來是這樣的一種解決方案,(後來這個腳本會在被稱爲pre-commit鉤子)
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)
腳本如何工作
它試圖找到父分支(詳情請看[這裏] [2])。 然後使用做了三路合併:
git merge-tree <base> <branch1> <branch2>
基地 - >當前FETCH_HEAD - 當前父分支
BRANCH1的>找到當前FETCH_HEAD &父母之間的最佳共祖先/最近的父分支
BRANCH2 - 當前父分支>父/最近的父分支
這將在MEM得到ory合併遠程和本地分支而不實際更改索引。
如果有人改進了這個腳本,請發表評論。
在此先感謝!
在分支'develop'上做'git merge feature',解決合併衝突,然後提交。 – Kelvin
你想阻止用戶創建* local *提交?只要讓他們承諾,並在方便時進行合併/重組。 –
@Oliver我認爲這是一個很好的問題。如果回答了,預先提交的鉤子可以防止在沒有通知您的基礎已經改變的情況下開發(=提交)。它可能會拋出一些警告,如「引用已經改變,先做一個合併?[y/n]」。另一方面,你必須提供更多的信息,你的參考是什麼。 – Christoph