Tôi có hai nhánh (A và B) và tôi muốn hợp nhất một tệp từ nhánh A với một tệp tương ứng từ Nhánh B.
git diff branch_name > patch
git apply patch
. stackoverflow.com/a/9473543/1091853
Tôi có hai nhánh (A và B) và tôi muốn hợp nhất một tệp từ nhánh A với một tệp tương ứng từ Nhánh B.
git diff branch_name > patch
git apply patch
. stackoverflow.com/a/9473543/1091853
Câu trả lời:
Tôi đã gặp vấn đề tương tự. Nói chính xác, tôi có hai nhánh A
và B
có cùng tệp nhưng giao diện lập trình khác nhau trong một số tệp. Bây giờ các phương thức của tệp f
, độc lập với sự khác biệt về giao diện trong hai nhánh, đã được thay đổi trong nhánh B
, nhưng sự thay đổi rất quan trọng đối với cả hai nhánh. Vì vậy, tôi cần hợp nhất chỉ tập tin f
của chi nhánh B
vào tập tin f
của chi nhánh A
.
Một lệnh đơn giản đã giải quyết vấn đề cho tôi nếu tôi cho rằng tất cả các thay đổi được cam kết trong cả hai nhánh A
và B
:
git checkout A
git checkout --patch B f
Lệnh đầu tiên chuyển sang nhánh A
, vào nơi tôi muốn hợp nhất B
phiên bản của tệp f
. Lệnh thứ hai bản vá lỗi tập tin f
với f
các HEAD
số B
. Bạn thậm chí có thể chấp nhận / loại bỏ các phần duy nhất của bản vá. Thay vì B
bạn có thể chỉ định bất kỳ cam kết nào ở đây, nó không phải như vậy HEAD
.
Chỉnh sửa cộng đồng : Nếu tệp f
trên B
chưa tồn tại A
, thì bỏ qua --patch
tùy chọn. Nếu không, bạn sẽ nhận được "Không thay đổi." thông điệp.
git checkout --patch B -- f
để có được điều này để làm việc.
a
trong giai đoạn tương tác, thay vì nhấn y
mỗi lần. Hoặc sử dụng git checkout B -- f
lệnh thay thế.
Đây là những gì tôi làm trong những tình huống này. Đó là một loại bùn nhưng nó hoạt động tốt với tôi.
Tôi đã thử vá và tình hình của tôi quá xấu cho nó. Vì vậy, trong ngắn hạn, nó sẽ trông như thế này:
Chi nhánh hoạt động: Chi nhánh thử nghiệm: B (chứa file.txt có các thay đổi tôi muốn gấp lại.)
git checkout A
Tạo chi nhánh mới dựa trên A:
git checkout -b tempAB
Hợp nhất B vào tempAB
git merge B
Sao chép băm sha1 của hợp nhất:
git log
commit 8dad944210dfb901695975886737dc35614fa94e
Merge: ea3aec1 0f76e61
Author: matthewe <matthewe@matthewe.com>
Date: Wed Oct 3 15:13:24 2012 -0700
Merge branch 'B' into tempAB
Kiểm tra chi nhánh làm việc của bạn:
git checkout A
Kiểm tra tập tin cố định của bạn:
git checkout 7e65b5a52e5f8b1979d75dffbbe4f7ee7dad5017 file.txt
Và ở đó bạn nên có nó. Cam kết kết quả của bạn.
A
đã chuyển hướng từ B
để bắt đầu, theo những cách khác. Sao chép sẽ ghi đè lên những khác biệt.
Điều này sử dụng Difftool nội bộ của git. Có thể một chút việc phải làm nhưng thẳng tiến.
#First checkout the branch you want to merge into
git checkout <branch_to_merge_into>
#Then checkout the file from the branch you want to merge from
git checkout <branch_to_merge_from> -- <file>
#Then you have to unstage that file to be able to use difftool
git reset HEAD <file>
#Now use difftool to chose which lines to keep. Click on the mergebutton in difftool
git difftool
#Save the file in difftool and you should be done.
--
(nhãn đối số trống), tài liệu kiểm tra git: ARGUMENT DISAMBIGUATION nói: "sử dụng git checkout -- <pathspec>
nếu bạn muốn kiểm tra các đường dẫn này ra khỏi chỉ mục." Điều này là do bạn có thể có cả nhánh và tệp / đường dẫn cùng tên. Trong các trường hợp như vậy, thay vì yêu cầu bạn định hướng xem chi nhánh hoặc đường dẫn nên được kiểm tra khi cả hai tồn tại, git sẽ chọn kiểm tra chi nhánh theo mặc định. Tuy nhiên, nếu ưu tiên --
git sẽ kiểm tra tệp / đường dẫn thay thế.
Tôi thấy cách tiếp cận này đơn giản và hữu ích: Cách "hợp nhất" các tệp cụ thể từ một nhánh khác
Hóa ra, chúng tôi đang cố gắng quá sức. Người bạn tốt của chúng tôi kiểm tra git là công cụ phù hợp cho công việc.
git checkout source_branch <paths>...
Chúng tôi chỉ đơn giản có thể cung cấp cho git checkout tên của nhánh tính năng A và các đường dẫn đến các tệp cụ thể mà chúng tôi muốn thêm vào nhánh chính của chúng tôi.
Xin vui lòng đọc toàn bộ bài viết để hiểu thêm
-p
tùy chọn trong lệnh đó. Sau đó, ghi đè lên bất kỳ phần nào trên tệp worktree của bạn trước đây đã chuyển hướng khỏi chi nhánh mà bạn đã kiểm tra, trước khi thay đổi bản vá, thật không may.
Bạn đã có thể sử dụng:
git merge-file
Mẹo: https://www.kernel.org/pub/software/scm/git/docs/git-merge-file.html
git merge-file
Lệnh sau sẽ (1) so sánh tệp của nhánh chính xác, với chủ (2) tương tác hỏi bạn những áp dụng sửa đổi nào.
kiểm tra git - chủ hàng
Chỉnh sửa của tôi đã bị từ chối, vì vậy tôi đang đính kèm cách xử lý các thay đổi hợp nhất từ một chi nhánh ở đây.
Nếu bạn phải làm điều này sau khi hợp nhất không chính xác, bạn có thể làm một cái gì đó như thế này:
# If you did a git pull and it broke something, do this first
# Find the one before the merge, copy the SHA1
git reflog
git reset --hard <sha1>
# Get remote updates but DONT auto merge it
git fetch github
# Checkout to your mainline so your branch is correct.
git checkout develop
# Make a new branch where you'll be applying matches
git checkout -b manual-merge-github-develop
# Apply your patches
git checkout --patch github/develop path/to/file
...
# Merge changes back in
git checkout develop
git merge manual-merge-github-develop # optionally add --no-ff
# You'll probably have to
git push -f # make sure you know what you're doing.
Giả sử B là nhánh hiện tại:
$ git diff A <file-path> > patch.tmp
$ git apply patch.tmp -R
Lưu ý rằng điều này chỉ áp dụng thay đổi cho tệp cục bộ. Bạn sẽ cần phải cam kết sau đó.
error: <file-path>: already exists in working directory
git diff Branch_A <file-path, filename> -- hash_commit > file_name.temp
Bạn có thể kiểm tra phiên bản cũ của tệp để hợp nhất, lưu nó dưới một tên khác, sau đó chạy bất cứ công cụ hợp nhất nào của bạn trên hai tệp.
ví dụ.
git show B:src/common/store.ts > /tmp/store.ts
(trong đó B là tên chi nhánh / cam kết / thẻ)
meld src/common/store.ts /tmp/store.ts
Tôi sẽ làm như
git format-patch branch_old..branch_new file
điều này sẽ tạo ra một bản vá cho tập tin.
Áp dụng bản vá tại mục tiêu Branch_old
git am blahblah.patch