ฉันจะรู้ได้อย่างไรว่ามีการรวมสาขาเข้ากับมาสเตอร์อยู่แล้ว?


1139

ฉันมีที่เก็บคอมไพล์หลายสาขา

ฉันจะรู้ได้อย่างไรว่าสาขาใดที่ถูกรวมเข้ากับสาขาหลักแล้ว?

คำตอบ:


1792

git branch --merged masterแสดงรายชื่อสาขาที่ผสานเป็นหลัก

git branch --mergedแสดงรายการสาขาที่รวมอยู่ในHEAD (เช่นส่วนปลายของสาขาปัจจุบัน)

git branch --no-merged แสดงรายการสาขาที่ยังไม่ถูกรวมเข้าด้วยกัน

โดยค่าเริ่มต้นสิ่งนี้ใช้ได้กับสาขาในท้องถิ่นเท่านั้น -aธงจะแสดงทั้งสาขาในประเทศและระยะไกลและ-rการแสดงธงเฉพาะสาขาที่ห่างไกล


2
เพียงบันทึกด้านข้างเมื่อฉันพยายามที่จะดูว่าสาขาระยะไกลได้รับการรวมฉันแรกตั้งสาขาติดตามท้องถิ่นระบุสถานะด้วยgit branch --mergedแล้วลบสาขาท้องถิ่นและระยะไกล
Kenneth Kalmer

83
เห็นได้ชัดว่าgit branch -a --merged/no-mergedใช้งานได้โดยไม่ต้องสร้างสาขาการติดตามในกระบวนการ
fresskoma

70
หรือเพียงแค่git branch -r --merged/--no-mergedค้นหาสาขาระยะไกลเท่านั้น
Asfand Qazi

5
มีวิธีใดที่จะลบสาขาที่ไม่ได้รวมซึ่งถูกรวมเข้าด้วยกันหลังจากรีบูต?
Ashfame

9
โปรดทราบว่า--merged/--no-mergedใช้อาร์กิวเมนต์การยอมรับหรือไม่ก็ได้หลังจากนั้น อย่างน้อยในเวอร์ชัน git ของฉัน (1.9.1) การเพิ่ม-aหรือ-rตั้งค่าสถานะหลังจากที่มันทำให้ฉันมีข้อผิดพลาดร้ายแรง เพิ่ม-aหรือก่อน-r --(no-)merged
Jonathan Gawrych

113

คุณสามารถใช้git merge-baseคำสั่งเพื่อค้นหาการคอมมิชชันล่าสุดระหว่างสองสาขา หากการกระทำนั้นเหมือนกับหัวหน้าสาขาของคุณแสดงว่าสาขานั้นได้รับการรวมเข้าด้วยกันอย่างสมบูรณ์

โปรดทราบว่าgit branch -dทำสิ่งนี้แล้วเพราะจะปฏิเสธที่จะลบสาขาที่ยังไม่ได้รวมเข้าด้วยกันอย่างสมบูรณ์


3
คำตอบของ @hari จะอธิบายรายละเอียดเพิ่มเติมเกี่ยวกับวิธีใช้สิ่งนี้
Muhd

เราจะทำสิ่งนี้โดยอัตโนมัติ / โดยทางโปรแกรมได้อย่างไร
Alexander Mills

1
"ยังไม่ถูกผสานอย่างสมบูรณ์" ... ผสานเข้ากับสาขาใด ๆ
Alexander Mills

@AlexanderMills: เข้าสู่สาขาปัจจุบันของคุณ
Greg Hewgill

2
@AlexanderMills: git branch -dจะปฏิเสธที่จะลบสาขาที่ไม่ได้รวมเข้ากับสาขาปัจจุบัน ไม่ลบสาขาปัจจุบัน
Greg Hewgill

27

มีวิธีแก้ปัญหาอินเตอร์เฟซแบบกราฟิกเช่นกัน เพียงพิมพ์

gitk --all

หน้าต่างแอปพลิเคชั่นใหม่จะแสดงพร้อมกับการแสดงกราฟิกของ repo ทั้งหมดของคุณซึ่งเป็นเรื่องง่ายมากที่จะทราบว่ามีการรวมสาขาแล้วหรือไม่


17
สิ่งที่ชัดเจนต้องมีการติดตั้งแอปพลิเคชันที่ไม่ได้เป็นส่วนหนึ่งของgitไคลเอนต์ บน apt-get install gitkUbuntu,
metame

บน macOS หากคุณมี Homebrew ติดตั้งไว้ก็จะbrew install git-guiได้gitkรับคำสั่ง
program247365

24

ฉันใช้ฟังก์ชันทุบตีต่อไปนี้เช่น: 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
}

3
สิ่งนี้ใช้ไม่ได้จริง หากสาขาต้นทางได้รับการผสานเข้ากับสาขาปลายทางแล้วและจากนั้นสาขาปลายทางจะได้รับการยอมรับเพิ่มขึ้นอีกสองสามครั้งมันก็ไม่ทำงานอีกต่อไป แต่ฉันไม่รู้ว่าทำไม
Alexander Mills

1
ดูคำถามที่นี่: stackoverflow.com/questions/51355331/…
Alexander Mills

18

git merge-base <commit> <commit>ใช้

คำสั่งนี้ค้นหาบรรพบุรุษที่ดีที่สุดระหว่างสองคอมมิต และถ้าบรรพบุรุษร่วมกันเหมือนกันกับการกระทำครั้งสุดท้ายของ "สาขา" จากนั้นเราสามารถสรุปได้อย่างปลอดภัยว่า "สาขา" ได้รับการรวมเข้ากับต้นแบบแล้ว

นี่คือขั้นตอน

  1. ค้นหาแฮชคอมมิทล่าสุดบนสาขาหลัก
  2. ค้นหาแฮชคอมมิชชันล่าสุดบน "branch"
  3. git merge-base <commit-hash-step1> <commit-hash-step2>คำสั่งเรียก
  4. หากเอาต์พุตของขั้นตอน 3 เหมือนกับเอาต์พุตของขั้นตอน 2 ดังนั้น "branch" จะถูกรวมเข้ากับมาสเตอร์แล้ว

ข้อมูลเพิ่มเติมเกี่ยวกับคอมไพล์ผสานฐานhttps://git-scm.com/docs/git-merge-base


2
ฉันคิดว่าสิ่งนี้จะบอกคุณได้หากมีการรวมเคล็ดลับ ตัวอย่างเช่นสิ่งนี้จะไม่บอกคุณว่าmasterถูกรวมเข้าไว้branchหรือไม่จากนั้นมีการเพิ่มการผูกมัดอีก 4 branchรายการ
mkobit

ทำไมไม่git log -1 $(git merge-base base-branch feature-branch)และถ้าคุณเห็นfeature-branchในผลลัพธ์คุณก็รู้ว่ามันถูกผสาน?
Carl G

12

ในหัวข้อการทำความสะอาดสาขาระยะไกล

git branch -r | xargs -t -n 1 git branch -r --contains

รายการนี้จะแสดงรายการของแต่ละสาขาระยะไกลตามด้วย SHAs ล่าสุดที่สาขานั้นอยู่ภายใน

สิ่งนี้มีประโยชน์ในการแยกแยะว่าสาขาใดที่รวมอยู่ในที่ห่างไกล แต่ยังไม่ถูกลบและสาขาที่ยังไม่ได้ทำการรวมเข้าด้วยกัน

หากคุณใช้ 'tig' (เหมือน gitk แต่เป็นเทอร์มินัล) คุณก็สามารถทำได้

tig origin/feature/someones-decaying-feature

เพื่อดูประวัติการกระทำของสาขาโดยไม่ต้องทำการตรวจสอบข้อมูล


3
ทำได้ดีมากชายคนนั้น! มีประโยชน์มากเมื่อคุณเข้าใจสิ่งที่กำลังแสดง! แอป GitHub จำเป็นต้องรวมสิ่งนี้ไว้ในการแสดงภาพของสาขาของคุณแทนที่จะเป็นรายการตัวอักษรที่ไม่มีลำดับชั้น!
CMash

12

ในการตรวจสอบว่าสาขาใดที่ถูกผสานเข้ากับมาสเตอร์คุณควรใช้คำสั่งเหล่านี้:

  • 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จะแสดงที่เก็บข้อมูลระยะไกลทั้งหมดที่รวมอยู่ในต้นแบบ


5

นี่คือเทคนิคของฉันเมื่อฉันต้องคิดดูว่ามีการรวมสาขาหรือไม่แม้ว่าจะได้รับการ rebased ให้ทันสมัยกับสาขาหลักของเราซึ่งเป็นสถานการณ์ทั่วไปสำหรับฟีเจอร์สาขา

วิธีการเหล่านี้ไม่ใช่วิธีพิสูจน์แบบโง่ ๆ แต่ฉันพบว่ามีประโยชน์หลายครั้ง

1 แสดงบันทึกสำหรับทุกสาขา

การใช้เครื่องมือแสดงผลเช่น gitk หรือ TortoiseGit หรือเพียงแค่บันทึก git ด้วย - ทั้งหมดให้ดูประวัติเพื่อดูการรวมทั้งหมดของสาขาหลัก คุณควรจะเห็นว่าสาขาคุณลักษณะเฉพาะนี้ได้รับการรวมหรือไม่

2 ลบสาขาระยะไกลเสมอเมื่อรวมในสาขาคุณสมบัติ

หากคุณมีนิสัยที่ดีที่จะลบทั้งในพื้นที่และสาขาระยะไกลเสมอเมื่อคุณรวมในสาขาฟีเจอร์คุณสามารถอัปเดตและตัดรีโมทบนคอมพิวเตอร์เครื่องอื่นของคุณและสาขาฟีเจอร์จะหายไป

เพื่อช่วยให้จำได้ว่าทำสิ่งนี้ฉันได้ใช้ส่วนขยาย 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

3 ค้นหาโดยส่งข้อความ

หากคุณไม่ลบสาขาระยะไกลออกไปเสมอคุณยังสามารถค้นหาข้อผูกพันที่คล้ายกันเพื่อพิจารณาว่าสาขาได้รับการรวมหรือไม่ ข้อผิดพลาดที่นี่คือถ้าสาขาระยะไกลได้รับการ 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"
}

@anjdeas - ขั้นตอนที่ 1 - คุณจะรู้ได้อย่างไรว่าสาขาใดได้รับการรวมเข้าด้วยกันเป็นหลัก ฉันได้ดูบันทึกและเครื่องมือ gui - และไม่สามารถหาได้ทุกที่ที่มันแสดงให้เห็นอย่างชัดเจน ???
Huff

@TheHuff ลองนี้: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]"
angularsen

@TheHuff ใน TortoiseGit หากคุณอยู่ในสาขาหลักมันควรจะแสดงการรวมเข้าเป็นหลัก
angularsen

ขอบคุณ - แต่ฉันจะรู้ได้อย่างไรว่าการผสานคืออะไร ฉันสมมติว่าพวกเขาทำทุกอย่างแล้ว - ถูกต้องไหม?
Huff

@TheHuff: คุณควรเห็นสองสตรีม / เส้นทางของคอมมิทที่รวมเข้าด้วยกันเพื่อยอมรับ "ดาวน์สตรีม" (สูงขึ้นในมุมมองบันทึก) การกระทำนั้นเป็นการผสานการกระทำ นอกจากนี้ในgit logที่คุณสามารถเพิ่ม--mergesเพื่อแสดงเฉพาะกระทำการผสาน stackoverflow.com/a/25986615/134761
angularsen

4

ต่อไปนี้เป็นหนึ่งในสายการบินเดียวที่จะแจ้งให้คุณทราบว่าสาขาปัจจุบันของคุณรวมหรือไม่มีข้อมูลจากสาขาต้นทาง / ต้นแบบระยะไกล:

$ 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

เพื่อตรวจสอบว่าฉันเป็นปัจจุบัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.