Hợp nhất, cập nhật và kéo các nhánh Git mà không cần sử dụng thanh toán


628

Tôi làm việc trong một dự án có 2 nhánh, A và B. Tôi thường làm việc trên nhánh A và hợp nhất các thứ từ nhánh B. Để hợp nhất, tôi thường làm:

git merge origin/branchB

Tuy nhiên, tôi cũng muốn giữ một bản sao địa phương của chi nhánh B, vì thỉnh thoảng tôi có thể kiểm tra chi nhánh mà không hợp nhất với chi nhánh của mình A. Đối với điều này, tôi sẽ làm:

git checkout branchB
git pull
git checkout branchA

Có cách nào để thực hiện các thao tác trên trong một lệnh và không phải chuyển nhánh qua lại không? Tôi có nên sử dụng git update-refcho điều đó? Làm sao?



1
Câu trả lời của Jakub cho câu hỏi được liên kết đầu tiên giải thích tại sao điều này nói chung là không thể. Một cách giải thích khác (một posteriori) là bạn không thể hợp nhất trong một repo trần, vì vậy rõ ràng nó đòi hỏi cây công việc.
Cascabel

3
@Eric: Lý do phổ biến là thanh toán tốn thời gian cho các repos lớn và họ cập nhật dấu thời gian ngay cả khi bạn quay lại cùng một phiên bản, vì vậy hãy nghĩ rằng mọi thứ cần phải được xây dựng lại.
Cascabel

Câu hỏi thứ hai tôi liên kết là hỏi về một trường hợp bất thường - hợp nhất thể chuyển tiếp nhanh, nhưng OP muốn hợp nhất bằng cách sử dụng --no-fftùy chọn, điều này khiến cho một cam kết hợp nhất được ghi lại bằng mọi cách. Nếu bạn quan tâm đến điều đó, câu trả lời của tôi ở đó cho thấy bạn có thể làm điều đó như thế nào - không hoàn toàn mạnh mẽ như câu trả lời được đăng của tôi ở đây, nhưng những điểm mạnh của cả hai chắc chắn có thể được kết hợp.
Cascabel

Câu trả lời:


972

Câu trả lời ngắn

Miễn là bạn đang thực hiện hợp nhất chuyển tiếp nhanh , thì bạn chỉ cần sử dụng

git fetch <remote> <sourceBranch>:<destinationBranch>

Ví dụ:

# Merge local branch foo into local branch master,
# without having to checkout master first.
# Here `.` means to use the local repository as the "remote":
git fetch . foo:master

# Merge remote branch origin/foo into local branch foo,
# without having to checkout foo first:
git fetch origin foo:foo

Mặc dù câu trả lời của Amber cũng sẽ hoạt động trong các trường hợp chuyển tiếp nhanh, nhưng sử dụng git fetchtheo cách này thay vào đó an toàn hơn một chút so với việc di chuyển lực lượng tham chiếu chi nhánh, vì git fetchsẽ tự động ngăn chặn việc không chuyển tiếp vô tình miễn là bạn không sử dụng +trong refspec.

Câu trả lời dài

Bạn không thể hợp nhất một nhánh B thành nhánh A mà không kiểm tra A trước nếu nó sẽ dẫn đến một sự hợp nhất không chuyển tiếp nhanh. Điều này là do một bản sao làm việc là cần thiết để giải quyết bất kỳ xung đột tiềm năng.

Tuy nhiên, trong trường hợp sáp nhập nhanh, điều này là có thể , bởi vì sự hợp nhất đó không bao giờ có thể dẫn đến xung đột, theo định nghĩa. Để làm điều này mà không cần kiểm tra một chi nhánh trước, bạn có thể sử dụng git fetchvới một refspec.

Đây là một ví dụ về việc cập nhật master(không cho phép các thay đổi không chuyển tiếp nhanh) nếu bạn có một chi nhánh khácfeature kiểm tra :

git fetch upstream master:master

Ca sử dụng này rất phổ biến, có lẽ bạn sẽ muốn tạo bí danh cho nó trong tệp cấu hình git của mình, như thế này:

[alias]
    sync = !sh -c 'git checkout --quiet HEAD; git fetch upstream master:master; git checkout --quiet -'

Bí danh này làm gì sau đây:

  1. git checkout HEAD: điều này đặt bản sao làm việc của bạn vào trạng thái tách rời. Điều này rất hữu ích nếu bạn muốn cập nhậtmaster trong khi bạn tình cờ kiểm tra. Tôi nghĩ rằng điều đó là cần thiết bởi vì nếu không thì tài liệu tham khảo chi nhánh mastersẽ không di chuyển, nhưng tôi không nhớ nếu điều đó thực sự nằm ngay trên đầu tôi.

  2. git fetch upstream master:master: điều này nhanh chóng chuyển tiếp địa phương của bạn masterđến cùng một nơi vớiupstream/master .

  3. git checkout - kiểm tra chi nhánh đã thanh toán trước đó của bạn (đó là những gì - làm trong trường hợp này).

Cú pháp của git fetch hợp nhất chuyển tiếp nhanh (không)

Nếu bạn muốn fetchlệnh không thành công nếu bản cập nhật không chuyển tiếp nhanh, thì bạn chỉ cần sử dụng một refspec của biểu mẫu

git fetch <remote> <remoteBranch>:<localBranch>

Nếu bạn muốn cho phép cập nhật không chuyển tiếp nhanh, thì bạn thêm một +vào phía trước của refspec:

git fetch <remote> +<remoteBranch>:<localBranch>

Lưu ý rằng bạn có thể chuyển repo cục bộ của mình dưới dạng tham số "từ xa" bằng cách sử dụng .:

git fetch . <sourceBranch>:<destinationBranch>

Tài liệu

Từ git fetchtài liệu giải thích cú pháp này (nhấn mạnh của tôi):

<refspec>

Định dạng của một <refspec>tham số là một dấu cộng tùy chọn +, theo sau là ref nguồn <src>, theo sau là dấu hai chấm :, theo sau là ref đích <dst>.

Tham chiếu từ xa phù hợp <src>được tìm nạp và nếu <dst>không phải là chuỗi rỗng, thì tham chiếu cục bộ phù hợp với nó được chuyển tiếp nhanh bằng cách sử dụng<src> . Nếu cộng tùy chọn+được sử dụng, ref cục bộ được cập nhật ngay cả khi nó không dẫn đến cập nhật chuyển tiếp nhanh.

Xem thêm

  1. Kiểm tra Git và hợp nhất mà không cần chạm vào cây làm việc

  2. Sáp nhập mà không thay đổi thư mục làm việc


3
git checkout --quiet HEADgit checkout --quiet --detachtừ Git 1.7.5.
Rafa

6
Tôi thấy tôi phải làm: git fetch . origin/foo:foocập nhật foo địa phương của tôi với nguồn gốc địa phương / foo
weston

3
Có một lý do nào đó các phần "git checkout HEAD --quiet" và "git checkout --quiet -" được bao gồm trong câu trả lời dài, nhưng không phải là câu trả lời ngắn? Tôi đoán đó là vì tập lệnh có thể được chạy khi bạn đã kiểm tra chính, mặc dù bạn chỉ có thể thực hiện thao tác git?
Sean

8
tại sao 'tìm nạp' lệnh để thực hiện 'hợp nhất' ở đây ... đơn giản là nó không có ý nghĩa; Nếu 'pull' là 'fetch' theo sau là 'merge', thì phải có một sự hợp nhất 'hợp nhất - chỉ-tương đương' sẽ cập nhật 'nhánh' từ 'origin / Branch' cục bộ, với điều kiện là 'fetch' đã được chạy
Ed Randall

1
Cảm ơn vì git checkout -mánh khóe! Chỉ cần dễ dàng như cd -.
Steed

84

Không có. Việc kiểm tra chi nhánh mục tiêu là cần thiết để cho phép bạn giải quyết xung đột, trong số những điều khác (nếu Git không thể tự động hợp nhất chúng).

Tuy nhiên, nếu hợp nhất là một thứ sẽ chuyển tiếp nhanh, bạn không cần kiểm tra nhánh mục tiêu, vì thực sự bạn không cần hợp nhất bất cứ thứ gì - tất cả những gì bạn phải làm là cập nhật nhánh để trỏ đến đầu mới ref. Bạn có thể làm điều này với git branch -f:

git branch -f branch-b branch-a

Sẽ cập nhật branch-bđể chỉ vào đầu của branch-a.

Các -ftùy chọn là viết tắt của --force, có nghĩa là bạn phải cẩn thận khi sử dụng nó.

Đừng sử dụng nó trừ khi bạn hoàn toàn chắc chắn việc hợp nhất sẽ được chuyển tiếp nhanh.


46
Chỉ cần rất cẩn thận để không làm điều đó trừ khi bạn chắc chắn rằng việc hợp nhất sẽ diễn ra nhanh chóng! Không muốn nhận ra sau này bạn đã đặt nhầm chỗ.
Cascabel

@FuadSaud Không chính xác. git resetchỉ hoạt động trên các chi nhánh hiện đang thanh toán.
Amber

9
Kết quả tương tự (chuyển tiếp nhanh) đạt được bằng cách git fetch upstream branch-b:branch-b(lấy từ câu trả lời này ).
Oliver

6
Để mở rộng nhận xét của @ Oliver, bạn cũng có thể làm git fetch <remote> B:A, trong đó B và A là hai nhánh hoàn toàn khác nhau, nhưng B có thể được chuyển nhanh sang A. Bạn cũng có thể chuyển kho lưu trữ cục bộ của mình dưới dạng "từ xa" bằng cách sử dụng .làm bí danh từ xa: git fetch . B:A.

8
Câu hỏi của OP cho thấy khá rõ rằng việc hợp nhất sẽ thực sự nhanh chóng. Bất kể, branch -fcó thể nguy hiểm, như bạn chỉ ra. Vì vậy, đừng sử dụng nó! Sử dụng fetch origin branchB:branchB, sẽ thất bại một cách an toàn nếu việc hợp nhất không chuyển tiếp nhanh.
Bennett McElwee

30

Như Amber đã nói, sáp nhập nhanh là trường hợp duy nhất mà bạn có thể hình dung làm điều này. Bất kỳ sự hợp nhất nào khác có thể hình dung cần phải trải qua toàn bộ hợp nhất ba chiều, áp dụng các bản vá, giải quyết thỏa thuận xung đột - và điều đó có nghĩa là cần phải có các tệp xung quanh.

Tôi tình cờ có một tập lệnh xung quanh tôi sử dụng cho chính xác điều này: thực hiện các phép hợp nhất chuyển tiếp nhanh mà không cần chạm vào cây công việc (trừ khi bạn hợp nhất vào CHÍNH). Nó hơi dài, bởi vì nó ít nhất là một chút mạnh mẽ - nó kiểm tra để đảm bảo rằng sự hợp nhất sẽ diễn ra nhanh chóng, sau đó thực hiện nó mà không cần kiểm tra chi nhánh, nhưng tạo ra kết quả tương tự như bạn có - bạn thấy diff --stattóm tắt các thay đổi và mục nhập trong reflog hoàn toàn giống như một sự hợp nhất chuyển tiếp nhanh, thay vì "thiết lập lại" mà bạn nhận được nếu bạn sử dụng branch -f. Nếu bạn đặt tên cho nó git-merge-ffvà thả nó vào thư mục bin của bạn, bạn có thể gọi nó như một lệnh git : git merge-ff.

#!/bin/bash

_usage() {
    echo "Usage: git merge-ff <branch> <committish-to-merge>" 1>&2
    exit 1
}

_merge_ff() {
    branch="$1"
    commit="$2"

    branch_orig_hash="$(git show-ref -s --verify refs/heads/$branch 2> /dev/null)"
    if [ $? -ne 0 ]; then
        echo "Error: unknown branch $branch" 1>&2
        _usage
    fi

    commit_orig_hash="$(git rev-parse --verify $commit 2> /dev/null)"
    if [ $? -ne 0 ]; then
        echo "Error: unknown revision $commit" 1>&2
        _usage
    fi

    if [ "$(git symbolic-ref HEAD)" = "refs/heads/$branch" ]; then
        git merge $quiet --ff-only "$commit"
    else
        if [ "$(git merge-base $branch_orig_hash $commit_orig_hash)" != "$branch_orig_hash" ]; then
            echo "Error: merging $commit into $branch would not be a fast-forward" 1>&2
            exit 1
        fi
        echo "Updating ${branch_orig_hash:0:7}..${commit_orig_hash:0:7}"
        if git update-ref -m "merge $commit: Fast forward" "refs/heads/$branch" "$commit_orig_hash" "$branch_orig_hash"; then
            if [ -z $quiet ]; then
                echo "Fast forward"
                git diff --stat "$branch@{1}" "$branch"
            fi
        else
            echo "Error: fast forward using update-ref failed" 1>&2
        fi
    fi
}

while getopts "q" opt; do
    case $opt in
        q ) quiet="-q";;
        * ) ;;
    esac
done
shift $((OPTIND-1))

case $# in
    2 ) _merge_ff "$1" "$2";;
    * ) _usage
esac

PS Nếu bất cứ ai nhìn thấy bất kỳ vấn đề với kịch bản đó, xin vui lòng bình luận! Đó là một công việc viết và quên, nhưng tôi rất vui khi cải thiện nó.


bạn có thể quan tâm đến stackoverflow.com/a/5148202/717355 để so sánh
Philip Oakley

@PhilipOakley Từ một cái nhìn nhanh chóng, rằng cốt lõi làm chính xác như của tôi. Nhưng của tôi không được mã hóa thành một cặp nhánh duy nhất, nó có nhiều lỗi xử lý hơn, nó mô phỏng đầu ra của git-merge và nó có ý nghĩa gì nếu bạn gọi nó trong khi bạn thực sự ở trong nhánh.
Cascabel

Tôi có của bạn trong thư mục \ bin của tôi ;-) Tôi chỉ quên nó và đang nhìn xung quanh, thấy kịch bản đó và nó nhắc tôi nhớ lại! Bản sao của tôi có liên kết này và# or git branch -f localbranch remote/remotebranch để nhắc nhở tôi về nguồn và các tùy chọn. Đưa nhận xét của bạn về liên kết khác +1.
Philip Oakley

3
+1, cũng có thể được mặc định "$branch@{u}"là ủy quyền hợp nhất để có được nhánh ngược dòng (từ kernel.org/pub/software/scm/git/docs/gitrevutions.html )
ủy quyền orip

Cảm ơn! Bất kỳ cơ hội nào bạn có thể ném một ví dụ đơn giản - sử dụng vào câu trả lời?
nmr

20

Bạn chỉ có thể làm điều này nếu hợp nhất là một chuyển tiếp nhanh. Nếu không, git cần phải kiểm tra các tệp để nó có thể hợp nhất chúng!

Để làm điều đó chỉ với một chuyển tiếp nhanh :

git fetch <branch that would be pulled for branchB>
git update-ref -m "merge <commit>: Fast forward" refs/heads/<branch> <commit>

nơi <commit>được cam kết lấy, một trong những bạn muốn nhanh về phía trước để. Điều này về cơ bản giống như sử dụnggit branch -f để di chuyển chi nhánh, ngoại trừ nó cũng ghi lại nó trong reflog như thể bạn thực sự đã hợp nhất.

Xin vui lòng, xin vui lòng, xin vui lòng không làm điều này cho một cái gì đó không phải là nhanh về phía trước, hoặc bạn sẽ chỉ được đặt chi nhánh của bạn cho người khác cam kết. (Để kiểm tra, hãy xem nếu git merge-base <branch> <commit>cung cấp SHA1 của chi nhánh.)


4
Có cách nào để làm cho nó thất bại nếu nó không thể nhanh chóng chuyển tiếp?
gman

2
@gman bạn có thể sử dụng git merge-base --is-ancestor <A> <B>. "B" là thứ cần được hợp nhất thành "A". Ví dụ sẽ là A = master và B = Develop, đảm bảo phát triển có thể chuyển tiếp nhanh thành master. Lưu ý: Nó tồn tại với 0 nếu không có khả năng ff, tồn tại với 1 nếu có.
eddiemoya

1
Không được ghi lại trong git-scm, nhưng nó có trên kernal.org. kernel.org/pub/software/scm/git/docs/git-merge-base.html
eddiemoya

Tạo một ý chính nhanh chóng để kết thúc những gì tôi đang nói (không thực sự kiểm tra nó, nhưng sẽ giúp bạn chủ yếu ở đó). gist.github.com/eddiemoya/ad4285b2d8a6bdabf432 ---- như một mặt lưu ý, tôi đã có hầu hết tiện dụng này, tôi đã có một kịch bản rằng séc cho ff và nếu không cho phép bạn rebase nhánh mong muốn đầu tiên - sau đó ff hòa trộn - Tất cả mà không kiểm tra bất cứ điều gì.
eddiemoya

12

Trong trường hợp của bạn, bạn có thể sử dụng

git fetch origin branchB:branchB

đó là những gì bạn muốn (giả sử hợp nhất là chuyển tiếp nhanh). Nếu chi nhánh không thể được cập nhật vì nó yêu cầu hợp nhất không chuyển tiếp nhanh, thì điều này không thành công với một thông báo.

Hình thức tìm nạp này cũng có một số tùy chọn hữu ích hơn:

git fetch <remote> <sourceBranch>:<destinationBranch>

Lưu ý rằng <remote> có thể là một kho lưu trữ cục bộ<sourceBranch>có thể là một nhánh theo dõi. Vì vậy, bạn có thể cập nhật một chi nhánh địa phương, ngay cả khi nó không được kiểm tra, mà không cần truy cập mạng .

Hiện tại, quyền truy cập máy chủ ngược dòng của tôi là thông qua VPN chậm, vì vậy tôi định kỳ kết nối, git fetchđể cập nhật tất cả các điều khiển từ xa, sau đó ngắt kết nối. Sau đó, nếu, nói, chủ từ xa đã thay đổi, tôi có thể làm

git fetch . remotes/origin/master:master

để cập nhật an toàn cho chủ địa phương của tôi, ngay cả khi tôi hiện có một số chi nhánh khác được kiểm tra. Không cần truy cập mạng.


11

Một cách khác, thừa nhận khá tàn bạo là chỉ tạo lại chi nhánh:

git fetch remote
git branch -f localbranch remote/remotebranch

Điều này sẽ loại bỏ nhánh lỗi thời tại địa phương và tạo lại một nhánh có cùng tên, vì vậy hãy cẩn thận ...


Bây giờ tôi mới thấy rằng câu trả lời ban đầu đã đề cập đến chi nhánh -f ... Tuy nhiên, tôi không thấy một lợi thế trong việc hợp nhất trong reflog cho trường hợp sử dụng được mô tả ban đầu.
kkoehne

7

Bạn có thể sao chép repo và thực hiện hợp nhất trong repo mới. Trên cùng một hệ thống tập tin, điều này sẽ liên kết cứng thay vì sao chép hầu hết dữ liệu. Kết thúc bằng cách kéo kết quả vào repo ban đầu.


4

Nhập git-Forward-merge :

Không cần phải kiểm tra đích, git-forward-merge <source> <destination>hợp nhất nguồn vào nhánh đích.

https://github.com/schuyler1d/git-forward-merge

Chỉ hoạt động đối với hợp nhất tự động, nếu có xung đột bạn cần sử dụng hợp nhất thông thường.


2
Tôi nghĩ rằng điều này tốt hơn git fetch <remote> <source>: <Destination>, bởi vì chuyển tiếp nhanh là một hoạt động hợp nhất không tìm nạp và nó dễ viết hơn. Điều tồi tệ là nó không nằm trong git mặc định.
Binary

4

Đối với nhiều trường hợp (chẳng hạn như hợp nhất), bạn chỉ có thể sử dụng nhánh từ xa mà không phải cập nhật nhánh theo dõi cục bộ. Thêm một tin nhắn trong reflog nghe có vẻ như quá mức cần thiết và sẽ ngăn chặn nó nhanh hơn. Để dễ khôi phục hơn, hãy thêm phần sau vào cấu hình git của bạn

[core]
    logallrefupdates=true

Sau đó gõ

git reflog show mybranch

để xem lịch sử gần đây cho chi nhánh của bạn


Tôi nghĩ phần phải [core]không [user]? (và theo mặc định là trên, đối với các repos có không gian làm việc (nghĩa là không trống).
eckes

3

Tôi đã viết một hàm shell cho một trường hợp sử dụng tương tự mà tôi gặp hàng ngày trên các dự án. Về cơ bản, đây là một lối tắt để giữ cho các chi nhánh địa phương được cập nhật với một chi nhánh chung như phát triển trước khi mở PR, v.v.

Đăng bài này ngay cả khi bạn không muốn sử dụng checkout, trong trường hợp người khác không bận tâm đến sự ràng buộc đó.

glmh("git pull and merge here") sẽ tự động checkout branchB, pullmới nhất, lại checkout branchA, và merge branchB.

Không giải quyết nhu cầu giữ một bản sao cục bộ của nhánhA, nhưng có thể dễ dàng được sửa đổi để làm như vậy bằng cách thêm một bước trước khi kiểm tra nhánhB. Cái gì đó như...

git branch ${branchA}-no-branchB ${branchA}

Để hợp nhất chuyển tiếp nhanh đơn giản, điều này bỏ qua lời nhắc thông báo cam kết.

Đối với các hợp nhất không chuyển tiếp nhanh, điều này đặt chi nhánh của bạn ở trạng thái giải quyết xung đột (bạn có thể cần phải can thiệp).

Để thiết lập, thêm .bashrchoặc .zshrc, v.v .:

glmh() {
    branchB=$1
    [ $# -eq 0 ] && { branchB="develop" }
    branchA="$(git branch | grep '*' | sed 's/* //g')"
    git checkout ${branchB} && git pull
    git checkout ${branchA} && git merge ${branchB} 
}

Sử dụng:

# No argument given, will assume "develop"
> glmh

# Pass an argument to pull and merge a specific branch
> glmh your-other-branch

Lưu ý: Điều này không đủ mạnh để xử lý các đối số ngoài tên chi nhánh đểgit merge


2

Một cách khác để làm điều này một cách hiệu quả là:

git fetch
git branch -d branchB
git branch -t branchB origin/branchB

Bởi vì đó là chữ thường -d, nó sẽ chỉ xóa nó nếu dữ liệu vẫn còn tồn tại ở đâu đó. Nó tương tự như câu trả lời của @ kkoehne trừ khi nó không có hiệu lực. Bởi vì -tnó sẽ thiết lập điều khiển từ xa một lần nữa.

Tôi có một nhu cầu hơi khác so với OP, đó là tạo ra một nhánh tính năng mới develop(hoặc master), sau khi hợp nhất một yêu cầu kéo. Điều đó có thể được thực hiện trong một lớp lót mà không cần lực lượng, nhưng nó không cập nhật developchi nhánh địa phương . Đó chỉ là vấn đề kiểm tra một chi nhánh mới và có được dựa trên origin/develop:

git checkout -b new-feature origin/develop

1

chỉ để kéo chủ mà không kiểm tra chủ tôi sử dụng

git fetch origin master:master


1

Hoàn toàn có thể thực hiện bất kỳ sự hợp nhất nào, thậm chí là không hợp nhất về phía trước, mà không có git checkout. Câu worktreetrả lời của @grego là một gợi ý hay. Để mở rộng về điều đó:

cd local_repo
git worktree add _master_wt master
cd _master_wt
git pull origin master:master
git merge --no-ff -m "merging workbranch" my_work_branch
cd ..
git worktree remove _master_wt

Bây giờ bạn đã hợp nhất chi nhánh công việc cục bộ với masterchi nhánh địa phương mà không cần chuyển đổi thanh toán.


1

Nếu bạn muốn giữ cùng một cây với một trong những nhánh bạn muốn hợp nhất (nghĩa là không phải là "hợp nhất" thực sự), bạn có thể làm như thế này.

# Check if you can fast-forward
if git merge-base --is-ancestor a b; then
    git update-ref refs/heads/a refs/heads/b
    exit
fi

# Else, create a "merge" commit
commit="$(git commit-tree -p a -p b -m "merge b into a" "$(git show -s --pretty=format:%T b)")"
# And update the branch to point to that commit
git update-ref refs/heads/a "$commit"

1
git worktree add [-f] [--detach] [--checkout] [--lock] [-b <new-branch>] <path> [<commit-ish>]

Bạn co thể thử git worktree để hai nhánh mở cạnh nhau, điều này nghe có vẻ như đó là điều bạn muốn nhưng rất khác so với một số câu trả lời khác mà tôi đã thấy ở đây.

Theo cách này, bạn có thể có hai nhánh riêng biệt theo dõi trong cùng một git repo, do đó bạn chỉ phải tìm nạp một lần để nhận được cập nhật trong cả hai cây làm việc (thay vì phải git clone hai lần và git kéo từng cái)

Worktree sẽ tạo một thư mục làm việc mới cho mã của bạn, nơi bạn có thể có một nhánh khác được kiểm tra đồng thời thay vì hoán đổi các nhánh tại chỗ.

Khi bạn muốn loại bỏ nó, bạn có thể làm sạch với

git worktree remove [-f] <worktree>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.