ใช้gitk log
ฉันไม่สามารถเห็นความแตกต่างระหว่างทั้งสอง ฉันจะสังเกตเห็นความแตกต่างได้อย่างไร (ด้วยคำสั่ง git หรือเครื่องมือบางตัว)
ใช้gitk log
ฉันไม่สามารถเห็นความแตกต่างระหว่างทั้งสอง ฉันจะสังเกตเห็นความแตกต่างได้อย่างไร (ด้วยคำสั่ง git หรือเครื่องมือบางตัว)
คำตอบ:
การ--no-ff
ตั้งค่าสถานะป้องกันไม่ให้git merge
เรียกใช้ "การกรอไปข้างหน้า" หากตรวจพบว่าปัจจุบันของคุณHEAD
เป็นบรรพบุรุษของการกระทำที่คุณพยายามผสาน กรอไปข้างหน้าคือเมื่อแทนที่การสร้างคอมมิชชันคอมไพล์เพียงแค่เลื่อนตัวชี้แบรนช์ของคุณไปยังจุดที่คอมมิทเข้ามา สิ่งนี้มักเกิดขึ้นเมื่อดำเนินการgit pull
โดยไม่มีการเปลี่ยนแปลงในเครื่อง
อย่างไรก็ตามบางครั้งคุณต้องการป้องกันพฤติกรรมนี้โดยทั่วไปเกิดขึ้นเนื่องจากคุณต้องการรักษาโทโพโลยีสาขาเฉพาะ (เช่นคุณรวมอยู่ในสาขาหัวข้อและคุณต้องการให้แน่ใจว่ามันเป็นแบบนั้นเมื่ออ่านประวัติ) เพื่อที่จะทำเช่นนั้นคุณสามารถผ่าน--no-ff
ธงและgit merge
จะเสมอสร้างผสานแทนการส่งต่ออย่างรวดเร็ว
ในทำนองเดียวกันหากคุณต้องการดำเนินการgit pull
หรือใช้git merge
เพื่อการกรอไปข้างหน้าอย่างรวดเร็วและคุณต้องการประกันตัวหากไม่สามารถกรอไปข้างหน้าอย่างรวดเร็วคุณสามารถใช้การ--ff-only
ตั้งค่าสถานะ วิธีนี้คุณสามารถทำสิ่งที่ชอบเป็นประจำgit pull --ff-only
โดยไม่ต้องคิดและถ้าเกิดข้อผิดพลาดคุณสามารถย้อนกลับไปและตัดสินใจว่าคุณต้องการผสานหรือลดระดับ
gitk
หรือgit log --graph
ว่าการผสานการกรอไปข้างหน้าไม่ได้สร้างการคอมมิชชันในขณะที่การส่งต่อที่ไม่ใช่กรอ
--no-ff
จากคุณสมบัติในการพัฒนาหรือพัฒนาเพื่อ master คล้ายกับการรวมคำขอดึง?
--no-ff
มันไม่เทียบเท่า
นี่คือไซต์ที่มีคำอธิบายที่ชัดเจนและภาพประกอบของการใช้git merge --no-ff
:
จนกระทั่งฉันเห็นสิ่งนี้ฉันก็หายไปกับคอมไพล์อย่างสมบูรณ์ การใช้--no-ff
ช่วยให้ใครบางคนตรวจสอบประวัติเพื่อดูสาขาที่คุณเช็คเอาท์เพื่อทำงานอย่างชัดเจน (ลิงก์นั้นชี้ไปที่เครื่องมือสร้างภาพ "เครือข่าย" ของ GitHub) และนี่คืออีกหนึ่งการอ้างอิงที่ยอดเยี่ยมพร้อมภาพประกอบ การอ้างอิงนี้เติมเต็มสิ่งแรกที่มีความสำคัญมากกว่าผู้ที่ไม่คุ้นเคยกับ git
หากคุณเป็นเหมือนฉันไม่ใช่ Git-guru คำตอบของฉันที่นี่จะอธิบายถึงการจัดการการลบไฟล์ออกจากการติดตามของGit โดยไม่ต้องลบไฟล์เหล่านั้นออกจากระบบไฟล์ในตัวเครื่องซึ่งดูเหมือนว่าเอกสารไม่ดี แต่มักเกิดขึ้น สถานการณ์ newb อื่นกำลังได้รับรหัสปัจจุบันซึ่งยังสามารถหลบหลีกฉันได้
ฉันอัปเดตแพ็คเกจไปยังเว็บไซต์ของฉันและต้องย้อนกลับไปที่บันทึกย่อของฉันเพื่อดูขั้นตอนการทำงานของฉัน ฉันคิดว่ามันมีประโยชน์ที่จะเพิ่มตัวอย่างในคำตอบนี้
เวิร์กโฟลว์ของคำสั่ง git ของฉัน:
git checkout -b contact-form
(do your work on "contact-form")
git status
git commit -am "updated form in contact module"
git checkout master
git merge --no-ff contact-form
git branch -d contact-form
git push origin master
ด้านล่าง:การใช้งานจริงรวมถึงคำอธิบาย
หมายเหตุ: เอาต์พุตด้านล่างถูกตัดออก คอมไพล์ค่อนข้าง verbose
$ git status
# On branch master
# Changed but not updated:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: ecc/Desktop.php
# modified: ecc/Mobile.php
# deleted: ecc/ecc-config.php
# modified: ecc/readme.txt
# modified: ecc/test.php
# deleted: passthru-adapter.igs
# deleted: shop/mickey/index.php
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# ecc/upgrade.php
# ecc/webgility-config.php
# ecc/webgility-config.php.bak
# ecc/webgility-magento.php
สังเกตเห็น 3 สิ่งจากด้านบน:
1) ในผลลัพธ์คุณสามารถเห็นการเปลี่ยนแปลงจากการอัพเกรดแพ็คเกจ ECC รวมถึงการเพิ่มไฟล์ใหม่
2) แจ้งให้ทราบด้วยว่ามีสองไฟล์ (ไม่ใช่ใน/ecc
โฟลเดอร์) ฉันลบโดยไม่ขึ้นกับการเปลี่ยนแปลงนี้ แทนที่จะสับสนกับการลบไฟล์เหล่านั้นด้วยecc
ฉันจะทำการแยกcleanup
สาขาในภายหลังเพื่อสะท้อนการลบไฟล์เหล่านั้น
3) ฉันไม่ได้ทำตามขั้นตอนการทำงานของฉัน! ฉันลืมเกี่ยวกับคอมไพล์ในขณะที่ฉันพยายามที่จะทำงาน ecc อีก
ด้านล่าง: แทนที่จะรวมทุกอย่างgit commit -am "updated ecc package"
ตามปกติแล้วฉันแค่ต้องการเพิ่มไฟล์ใน/ecc
โฟลเดอร์ ไฟล์ที่ถูกลบเหล่านั้นไม่ได้เป็นส่วนหนึ่งของฉันโดยเฉพาะgit add
แต่เนื่องจากพวกเขามีการติดตามในคอมไพล์แล้วฉันต้องลบพวกเขาออกจากการกระทำของสาขานี้:
$ git checkout -b ecc
$ git add ecc/*
$ git reset HEAD passthru-adapter.igs
$ git reset HEAD shop/mickey/index.php
Unstaged changes after reset:
M passthru-adapter.igs
M shop/mickey/index.php
$ git commit -m "Webgility ecc desktop connector files; integrates with Quickbooks"
$ git checkout master
D passthru-adapter.igs
D shop/mickey/index.php
Switched to branch 'master'
$ git merge --no-ff ecc
$ git branch -d ecc
Deleted branch ecc (was 98269a2).
$ git push origin master
Counting objects: 22, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (14/14), 59.00 KiB, done.
Total 14 (delta 10), reused 0 (delta 0)
To git@github.com:me/mywebsite.git
8a0d9ec..333eff5 master -> master
หลังจากใช้กระบวนการนี้มากกว่า 10 ครั้งต่อวันฉันได้เขียนสคริปต์แบบแบตช์เพื่อเรียกใช้คำสั่งดังนั้นฉันจึงสร้างgit_update.sh <branch> <"commit message">
สคริปต์ที่เหมาะสมสำหรับการทำตามขั้นตอนข้างต้น นี่คือที่มาสำคัญสำหรับสคริปต์นั้น
แทนที่จะgit commit -am
ฉันเลือกไฟล์จากรายการ "แก้ไข" ที่สร้างผ่านgit status
แล้ววางไฟล์ในสคริปต์นี้ สิ่งนี้เกิดขึ้นเพราะฉันทำการแก้ไขหลายสิบครั้ง แต่ต้องการชื่อสาขาที่หลากหลายเพื่อช่วยจัดกลุ่มการเปลี่ยนแปลง
--no-ff
ตัวเลือกหรือไม่
Explicit Merge : สร้างการผสานใหม่ (นี่คือสิ่งที่คุณจะได้รับถ้าคุณใช้--no-ff
)
กรอไปข้างหน้าอย่างรวดเร็ว:ส่งต่ออย่างรวดเร็วโดยไม่ต้องสร้างการคอมมิตใหม่:
Rebase : สร้างระดับฐานใหม่:
สควอช:บดขยี้หรือบีบ (บางสิ่ง) ด้วยแรงเพื่อให้แบน:
--no-ff
ตัวเลือกเพื่อให้แน่ใจว่าการผสานไปข้างหน้าอย่างรวดเร็วจะไม่เกิดขึ้นและที่วัตถุกระทำใหม่จะถูกสร้างขึ้น สิ่งนี้อาจเป็นที่ต้องการถ้าคุณต้องการให้คอมไพล์เก็บประวัติของฟีเจอร์แบรนช์
ในภาพด้านบนด้านซ้ายเป็นตัวอย่างของประวัติ git หลังจากใช้งานgit merge --no-ff
และด้านขวาเป็นตัวอย่างของการใช้git merge
เมื่อ ff merge เป็นไปได้
แก้ไข : รุ่นก่อนหน้าของภาพนี้ระบุเพียงผู้ปกครองเดียวสำหรับการรวมการกระทำ การรวมกระทำมีผู้ปกครองหลายคนกระทำซึ่งคอมไพล์ใช้ในการรักษาประวัติของ "สาขาฟีเจอร์" และสาขาเดิม ลิงก์ผู้ปกครองหลายรายการจะถูกเน้นด้วยสีเขียว
นี่เป็นคำถามที่เก่าและนี่คือค่อนข้างที่กล่าวถึงอย่างละเอียดในกระทู้อื่น ๆ แต่คำอธิบายที่ทำให้คลิกนี้สำหรับผมก็คือว่าไม่ใช่ผสานไปข้างหน้าอย่างรวดเร็วจะต้องแยกการกระทำ
git merge --no-ff ecc
คุณจะมีการรวมเพิ่มเติมที่กระทำในgit log
สาขาหลัก นั่นเป็นเทคนิคไม่จำเป็นในกรณีที่อาจารย์ชี้ไปที่บรรพบุรุษโดยตรงของการกระทำ ecc อยู่ แต่โดยการระบุตัวเลือก --no-ff คุณกำลังบังคับให้สร้างการผสานที่กระทำ มันจะมีชื่อ:Merge branch 'ecc'
แฟล็ก --no-ff ทำให้การผสานสร้างวัตถุการยอมรับใหม่เสมอแม้ว่าการผสานจะสามารถทำได้ด้วยการกรอไปข้างหน้า วิธีนี้จะช่วยหลีกเลี่ยงการสูญเสียข้อมูลเกี่ยวกับการดำรงอยู่ในอดีตของสาขาฟีเจอร์และกลุ่มต่างๆเข้าด้วยกันทั้งหมดยอมรับว่าได้เพิ่มฟีเจอร์นี้เข้าด้วยกัน