Có cách nào để xem tập tin nào đã thay đổi trong một nhánh không?
Có cách nào để xem tập tin nào đã thay đổi trong một nhánh không?
Câu trả lời:
Một thay thế cho câu trả lời của @Marco Ponti và tránh việc thanh toán:
git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)
Nếu hệ vỏ cụ thể của bạn không hiểu cấu trúc $ (), thay vào đó hãy sử dụng dấu kiểm ngược.
git diff --name-only <some-other-branch>
sẽ cho bạn thấy những tập tin nào khác nhau giữa chi nhánh hiện tại của bạn và <some-other-branch>
. Vì vậy, nó chủ yếu lệnh giống nhau, nhưng lưu ý rằng bạn có thể sử dụng để tìm các tập tin khác nhau giữa bất kỳ hai chi nhánh, thậm chí nếu họ không liên quan từ xa. Việc so sánh đó có hữu ích hay không phụ thuộc vào cấu trúc liên kết của các nhánh của bạn ... Ngoài ra, lưu ý <some-other-branch>
thực sự có thể là bất kỳ cam kết nào, hoặc bất cứ điều gì giải quyết thành một (thẻ, v.v.).
<notMainDev>
và <MY_CURRENT_CO_BRANCH>
gần đây nhất đã có một tổ tiên chung, và so sánh <notMainDev>
với tổ tiên đó. Tuy nhiên, bạn sẽ phải cung cấp tên chi nhánh hiện tại của mình, như git merge-base
mong đợi hai đối số - không có phím tắt, ít nhất là trong phiên bản hiện tại.
git branch | grep '\*' | awk '{print $2}'
sẽ nhận được cam kết cho nhánh giữa <notMainDev> và nhánh hiện tại của tôi. Sau đó tôi có thể thực hiện git diff --name-only <notMainDev> $ (git merge-base <notMainDev> git branch | grep '\*' | awk '{print $2}'
)
Tất cả bạn phải làm là như sau:
git checkout <notMainDev>
git diff --name-only <mainDev>
Điều này sẽ chỉ cho bạn các tên tệp khác nhau giữa hai nhánh.
<mainDev>
kể từ khi các nhánh chuyển hướng. Bạn có thể muốn sử dụng git diff --name-only <sha-of-branch-point>
thay thế hoặc xem câu trả lời thay thế mà tôi đã đăng để tránh việc thanh toán.
notMainDev
sẽ được cập nhật với các cam kết mainDev ... Tôi thường thấy cũng hữu ích khi thấy những khác biệt đó.
<sha-of-branch-point>
vớigit rev-parse <branch-name>
ngạc nhiên điều này đã không được nói cho đến nay!
git diff master...branch
Vì vậy, hãy xem những thay đổi chỉ trên branch
Để kiểm tra việc sử dụng chi nhánh hiện tại
git diff master...
Cảm ơn jqr
Đây là tay ngắn cho
git diff $(git merge-base master branch) branch
vì vậy cơ sở hợp nhất (cam kết phổ biến gần đây nhất giữa các nhánh) và đầu nhánh
Ngoài ra, sử dụng nguồn gốc / chủ thay vì chỉ chủ sẽ giúp ích trong trường hợp chủ địa phương của bạn bị lỗi thời
git diff --name-only master..
nếu bạn chỉ muốn tên của các tệp khác nhau giữa hai nhánh.
Tôi không thể tin rằng có rất nhiều cách để làm điều này. Tôi sử dụng whatchanged như ai đó đã đăng trước đó, chỉ với các đối số sau:
git whatchanged --name-only --pretty="" origin..HEAD
Điều này chỉ liệt kê tên tệp và chỉ những cái đã thay đổi trên nhánh hiện tại.
New users are encouraged to use git-log instead. The whatchanged command is essentially the same as git-log but defaults to show the raw format diff output and to skip merges.
Tôi thực sự thích câu trả lời của @ twalberg nhưng tôi không muốn phải gõ tên chi nhánh hiện tại mọi lúc. Vì vậy, tôi đang sử dụng điều này:
git diff --name-only $(git merge-base master HEAD)
git diff master... --name-only
khi chạy trên nhánh mục tiêu và nhận được kết quả tương tự. Bạn có thể tử tế khi cung cấp bất kỳ phản hồi nào về những gì tốt và xấu giữa câu trả lời của bạn và lệnh tôi đã cung cấp không?
git diff master.. --name-only
(lưu ý chỉ có 2 dấu chấm thay vì 3). Để hiểu ý nghĩa của các dấu chấm, hãy xem câu trả lời này
git whatchanged
dường như là một lựa chọn tốt
New users are encouraged to use git-log instead. The whatchanged command is essentially the same as git-log but defaults to show the raw format diff output and to skip merges.
git diff --name-only master...branch-name
mà chúng tôi muốn so sánh.
Điều gì nếu nó có thể dễ dàng như thế này?
git changed
Nếu bạn sẵn sàng cho rằng nhánh chính được gọi là "master" và bạn tạo các nhánh khác từ master, thì bạn có thể thêm bí danh này vào ~/.gitconfig
tệp của mình để làm cho nó dễ dàng:
cbranch = !"git branch | grep '*' | cut -f2 -d' '"
changed = !"git diff --name-only $(git cbranch) $(git merge-base $(git cbranch) master)"
Những giả định đó sẽ có hiệu quả với hầu hết mọi người trong hầu hết các tình huống, nhưng bạn phải nhận thức được rằng bạn đang thực hiện chúng.
Ngoài ra, bạn phải sử dụng một vỏ hỗ trợ $()
. Rất có khả năng vỏ của bạn hỗ trợ điều này .
git show --stat origin/branch_name
Điều này sẽ cung cấp cho bạn một danh sách các tập tin đã được thêm hoặc sửa đổi theo nhánh này.
Vì một số lý do không ai nhắc đến git-tree
. Xem https://stackoverflow.com/a/424142/1657819
git-tree
được ưa thích vì đó là lệnh hệ thống ống nước ; có nghĩa là lập trình (và, có lẽ, nhanh hơn)
(giả sử chi nhánh cơ sở là master
)
git diff-tree --no-commit-id --name-only -r master..branch-name
Tuy nhiên, điều này sẽ hiển thị cho bạn tất cả các tệp bị ảnh hưởng trong nhánh, nếu bạn chỉ muốn xem các tệp được sửa đổi rõ ràng , bạn có thể sử dụng --diff-filter
:
git diff-tree --no-commit-id --name-only -r master..branch-name --diff-filter=M
Ngoài ra, người ta có thể sử dụng --name-status
thay vì --name-only
để xem trạng thái của các tệp ( A
/ M
/ D
v.v.)
rubocop --fail-level error $(git diff-tree --no-commit-id --name-only -r origin/master..HEAD --diff-filter=M)
Câu trả lời được chấp nhận - git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)
- rất gần, nhưng tôi nhận thấy rằng nó có tình trạng sai khi xóa. Tôi đã thêm một tệp trong một nhánh và lệnh này (bằng cách sử dụng --name-status
) đã cho tệp tôi đã xóa trạng thái "A" và tệp tôi đã thêm trạng thái "D".
Tôi đã phải sử dụng lệnh này thay thế:
git diff --name-only $(git merge-base <notMainDev> <mainDev>)
Tệp bó sau dựa trên câu trả lời của twalberg nhưng sẽ hoạt động trong Windows:
@ECHO OFF
C: :: <== OR USE A DIFFERENT DRIVE
CD \path\to\where\git\files\are :: <== CHANGE TO THE ACTUAL PATH
SET /p b="Enter full path of an ALREADY MERGED branch to compare with origin/master: "
bash --login -i -c "git diff --name-only %b% $(git merge-base %b1% origin/drop2/master)"
PAUSE
Giả định ở trên giả định rằng nhánh chính là origin / master và git bash được bao gồm khi Git được cài đặt (và vị trí của nó nằm trong môi trường đường dẫn). Tôi thực sự cần phải hiển thị sự khác biệt thực tế bằng cách sử dụng một công cụ tìm khác biệt được cấu hình (kdiff3) để thay thế lệnh bash sau ở trên:
bash --login -i -c "git difftool --dir-diff %b% $(git merge-base %b1% origin/drop2/master)"