ฉันมีที่เก็บคอมไพล์หลายสาขา
ฉันจะรู้ได้อย่างไรว่าสาขาใดที่ถูกรวมเข้ากับสาขาหลักแล้ว?
ฉันมีที่เก็บคอมไพล์หลายสาขา
ฉันจะรู้ได้อย่างไรว่าสาขาใดที่ถูกรวมเข้ากับสาขาหลักแล้ว?
คำตอบ:
git branch --merged master
แสดงรายชื่อสาขาที่ผสานเป็นหลัก
git branch --merged
แสดงรายการสาขาที่รวมอยู่ในHEAD (เช่นส่วนปลายของสาขาปัจจุบัน)
git branch --no-merged
แสดงรายการสาขาที่ยังไม่ถูกรวมเข้าด้วยกัน
โดยค่าเริ่มต้นสิ่งนี้ใช้ได้กับสาขาในท้องถิ่นเท่านั้น -a
ธงจะแสดงทั้งสาขาในประเทศและระยะไกลและ-r
การแสดงธงเฉพาะสาขาที่ห่างไกล
git branch -a --merged/no-merged
ใช้งานได้โดยไม่ต้องสร้างสาขาการติดตามในกระบวนการ
git branch -r --merged/--no-merged
ค้นหาสาขาระยะไกลเท่านั้น
--merged/--no-merged
ใช้อาร์กิวเมนต์การยอมรับหรือไม่ก็ได้หลังจากนั้น อย่างน้อยในเวอร์ชัน git ของฉัน (1.9.1) การเพิ่ม-a
หรือ-r
ตั้งค่าสถานะหลังจากที่มันทำให้ฉันมีข้อผิดพลาดร้ายแรง เพิ่ม-a
หรือก่อน-r
--(no-)merged
คุณสามารถใช้git merge-base
คำสั่งเพื่อค้นหาการคอมมิชชันล่าสุดระหว่างสองสาขา หากการกระทำนั้นเหมือนกับหัวหน้าสาขาของคุณแสดงว่าสาขานั้นได้รับการรวมเข้าด้วยกันอย่างสมบูรณ์
โปรดทราบว่า
git branch -d
ทำสิ่งนี้แล้วเพราะจะปฏิเสธที่จะลบสาขาที่ยังไม่ได้รวมเข้าด้วยกันอย่างสมบูรณ์
git branch -d
จะปฏิเสธที่จะลบสาขาที่ไม่ได้รวมเข้ากับสาขาปัจจุบัน ไม่ลบสาขาปัจจุบัน
มีวิธีแก้ปัญหาอินเตอร์เฟซแบบกราฟิกเช่นกัน เพียงพิมพ์
gitk --all
หน้าต่างแอปพลิเคชั่นใหม่จะแสดงพร้อมกับการแสดงกราฟิกของ repo ทั้งหมดของคุณซึ่งเป็นเรื่องง่ายมากที่จะทราบว่ามีการรวมสาขาแล้วหรือไม่
git
ไคลเอนต์ บน apt-get install gitk
Ubuntu,
brew install git-gui
ได้gitk
รับคำสั่ง
ฉันใช้ฟังก์ชันทุบตีต่อไปนี้เช่น: git-is-merged develop feature/new-feature
git-is-merged () {
merge_destination_branch=$1
merge_source_branch=$2
merge_base=$(git merge-base $merge_destination_branch $merge_source_branch)
merge_source_current_commit=$(git rev-parse $merge_source_branch)
if [[ $merge_base = $merge_source_current_commit ]]
then
echo $merge_source_branch is merged into $merge_destination_branch
return 0
else
echo $merge_source_branch is not merged into $merge_destination_branch
return 1
fi
}
git merge-base <commit> <commit>
ใช้
คำสั่งนี้ค้นหาบรรพบุรุษที่ดีที่สุดระหว่างสองคอมมิต และถ้าบรรพบุรุษร่วมกันเหมือนกันกับการกระทำครั้งสุดท้ายของ "สาขา" จากนั้นเราสามารถสรุปได้อย่างปลอดภัยว่า "สาขา" ได้รับการรวมเข้ากับต้นแบบแล้ว
นี่คือขั้นตอน
git merge-base <commit-hash-step1> <commit-hash-step2>
คำสั่งเรียก ข้อมูลเพิ่มเติมเกี่ยวกับคอมไพล์ผสานฐานhttps://git-scm.com/docs/git-merge-base
master
ถูกรวมเข้าไว้branch
หรือไม่จากนั้นมีการเพิ่มการผูกมัดอีก 4 branch
รายการ
git log -1 $(git merge-base base-branch feature-branch)
และถ้าคุณเห็นfeature-branch
ในผลลัพธ์คุณก็รู้ว่ามันถูกผสาน?
ในหัวข้อการทำความสะอาดสาขาระยะไกล
git branch -r | xargs -t -n 1 git branch -r --contains
รายการนี้จะแสดงรายการของแต่ละสาขาระยะไกลตามด้วย SHAs ล่าสุดที่สาขานั้นอยู่ภายใน
สิ่งนี้มีประโยชน์ในการแยกแยะว่าสาขาใดที่รวมอยู่ในที่ห่างไกล แต่ยังไม่ถูกลบและสาขาที่ยังไม่ได้ทำการรวมเข้าด้วยกัน
หากคุณใช้ 'tig' (เหมือน gitk แต่เป็นเทอร์มินัล) คุณก็สามารถทำได้
tig origin/feature/someones-decaying-feature
เพื่อดูประวัติการกระทำของสาขาโดยไม่ต้องทำการตรวจสอบข้อมูล
ในการตรวจสอบว่าสาขาใดที่ถูกผสานเข้ากับมาสเตอร์คุณควรใช้คำสั่งเหล่านี้:
git branch <flag[-r/-a/none]> --merged master
รายการของทุกสาขารวมเข้ากับมาสเตอร์git branch <flag[-r/-a/none]> --merged master | wc -l
นับจำนวนสาขาทั้งหมดที่รวมเป็นหลักธงคือ:
-a
ธง - (ทั้งหมด)แสดงสาขาระยะไกลและท้องถิ่น-r
ธง - (ระยะไกล)แสดงสาขาระยะไกลเท่านั้น<emptyFlag>
- แสดงเฉพาะสาขาในประเทศเท่านั้นตัวอย่างเช่น: git branch -r --merged master
จะแสดงที่เก็บข้อมูลระยะไกลทั้งหมดที่รวมอยู่ในต้นแบบ
นี่คือเทคนิคของฉันเมื่อฉันต้องคิดดูว่ามีการรวมสาขาหรือไม่แม้ว่าจะได้รับการ rebased ให้ทันสมัยกับสาขาหลักของเราซึ่งเป็นสถานการณ์ทั่วไปสำหรับฟีเจอร์สาขา
วิธีการเหล่านี้ไม่ใช่วิธีพิสูจน์แบบโง่ ๆ แต่ฉันพบว่ามีประโยชน์หลายครั้ง
การใช้เครื่องมือแสดงผลเช่น gitk หรือ TortoiseGit หรือเพียงแค่บันทึก git ด้วย - ทั้งหมดให้ดูประวัติเพื่อดูการรวมทั้งหมดของสาขาหลัก คุณควรจะเห็นว่าสาขาคุณลักษณะเฉพาะนี้ได้รับการรวมหรือไม่
หากคุณมีนิสัยที่ดีที่จะลบทั้งในพื้นที่และสาขาระยะไกลเสมอเมื่อคุณรวมในสาขาฟีเจอร์คุณสามารถอัปเดตและตัดรีโมทบนคอมพิวเตอร์เครื่องอื่นของคุณและสาขาฟีเจอร์จะหายไป
เพื่อช่วยให้จำได้ว่าทำสิ่งนี้ฉันได้ใช้ส่วนขยาย git flow (รุ่น AVH)เพื่อสร้างและรวมสาขาฟีเจอร์ของฉันไว้ในเครื่องดังนั้นฉันจึงเพิ่มตะขอไหล git ต่อไปนี้เพื่อถามฉันว่าฉันต้องการลบสาขาระยะไกลโดยอัตโนมัติด้วยหรือไม่
ตัวอย่างสาขาคุณลักษณะการสร้าง / เสร็จสิ้น
554 Andreas:MyRepo(develop)$ git flow start tmp
Switched to a new branch 'feature/tmp'
Summary of actions:
- A new branch 'feature/tmp' was created, based on 'develop'
- You are now on branch 'feature/tmp'
Now, start committing on your feature. When done, use:
git flow feature finish tmp
555 Andreas:MyRepo(feature/tmp)$ git flow finish
Switched to branch 'develop'
Your branch is up-to-date with 'if/develop'.
Already up-to-date.
[post-flow-feature-finish] Delete remote branch? (Y/n)
Deleting remote branch: origin/feature/tmp.
Deleted branch feature/tmp (was 02a3356).
Summary of actions:
- The feature branch 'feature/tmp' was merged into 'develop'
- Feature branch 'feature/tmp' has been locally deleted
- You are now on branch 'develop'
556 Andreas:ScDesktop (develop)$
.git / ตะขอ / โพสต์ไหลคุณลักษณะที่เสร็จสิ้น
NAME=$1
ORIGIN=$2
BRANCH=$3
# Delete remote branch
# Allows us to read user input below, assigns stdin to keyboard
exec < /dev/tty
while true; do
read -p "[post-flow-feature-finish] Delete remote branch? (Y/n) " yn
if [ "$yn" = "" ]; then
yn='Y'
fi
case $yn in
[Yy] )
echo -e "\e[31mDeleting remote branch: $2/$3.\e[0m" || exit "$?"
git push $2 :$3;
break;;
[Nn] )
echo -e "\e[32mKeeping remote branch.\e[0m" || exit "$?"
break;;
* ) echo "Please answer y or n for yes or no.";;
esac
done
# Stop reading user input (close STDIN)
exec <&-
exit 0
หากคุณไม่ลบสาขาระยะไกลออกไปเสมอคุณยังสามารถค้นหาข้อผูกพันที่คล้ายกันเพื่อพิจารณาว่าสาขาได้รับการรวมหรือไม่ ข้อผิดพลาดที่นี่คือถ้าสาขาระยะไกลได้รับการ rebased เพื่อไม่รู้จักเช่น squashing commits หรือเปลี่ยนการกระทำข้อความ
ตัวอย่างคำสั่งในสาขาหลัก:
gru
gls origin/feature/foo
glf "my message"
ในทุบตี. โปรไฟล์กำหนดค่าของฉัน
alias gru='git remote update -p'
alias glf=findCommitByMessage
findCommitByMessage() {
git log -i --grep="$1"
}
git log --all --color --graph --decorate --topo-order --date=relative --abbrev-commit --pretty=format:"%C(green)%h %C(red bold)[%<(14)%ad] %Creset%s%Cred%d%C(blue) [%an]"
git log
ที่คุณสามารถเพิ่ม--merges
เพื่อแสดงเฉพาะกระทำการผสาน stackoverflow.com/a/25986615/134761
ต่อไปนี้เป็นหนึ่งในสายการบินเดียวที่จะแจ้งให้คุณทราบว่าสาขาปัจจุบันของคุณรวมหรือไม่มีข้อมูลจากสาขาต้นทาง / ต้นแบบระยะไกล:
$ git fetch && git branch -r --merged | grep -q origin/master && echo Incorporates origin/master || echo Out of date from origin/master
ฉันเจอคำถามนี้เมื่อทำงานในสาขาฟีเจอร์และบ่อยครั้งที่ต้องการตรวจสอบให้แน่ใจว่าฉันมีงานล่าสุดที่รวมอยู่ในสาขาการทำงานแยกต่างหากของฉันเอง
ที่จะพูดคุยการทดสอบนี้ผมได้เพิ่มนามแฝงต่อไปนี้เพื่อฉัน ~ / .gitconfig:
[alias]
current = !git branch -r --merged | grep -q $1 && echo Incorporates $1 || echo Out of date from $1 && :
จากนั้นฉันสามารถโทร:
$ git current origin/master
เพื่อตรวจสอบว่าฉันเป็นปัจจุบัน
git branch --merged
แล้วลบสาขาท้องถิ่นและระยะไกล