Bạn không thể làm điều đó chỉ với một lệnh git nhưng bạn có thể tự động hóa nó bằng một dòng bash.
Để cập nhật an toàn tất cả các chi nhánh với một dòng, đây là những gì tôi làm:
git fetch --all && for branch in $(git branch | sed '/*/{$q;h;d};$G' | tr -d '*') ; do git checkout $branch && git merge --ff-only || break ; done
Nếu nó không thể chuyển tiếp nhanh một nhánh hoặc gặp lỗi, nó sẽ dừng và để bạn ở nhánh đó để bạn có thể lấy lại quyền kiểm soát và hợp nhất thủ công.
Nếu tất cả các chi nhánh có thể được chuyển tiếp nhanh, nó sẽ kết thúc với chi nhánh bạn hiện đang ở, để lại cho bạn vị trí trước khi cập nhật.
Giải thích:
Để dễ đọc hơn, nó có thể được chia thành nhiều dòng:
git fetch --all && \
for branch in $(git branch | sed '/*/{$q;h;d};$G' | tr -d '*')
do git checkout $branch && \
git merge --ff-only || break
done
git fetch --all && ...
=> Lấy tất cả các ref từ tất cả các điều khiển từ xa và tiếp tục với lệnh tiếp theo nếu không có lỗi.
git branch | sed '/*/{$q;h;d};$G' | tr -d '*'
=> Từ đầu ra của git branch
, sed
lấy dòng bằng a *
và di chuyển đến cuối (để nhánh hiện tại sẽ được cập nhật lần cuối). Sau đó, tr
chỉ cần loại bỏ *
.
for branch in $(...) ; do git checkout $branch && git merge --ff-only || break ; done
=> Đối với mỗi tên nhánh thu được từ lệnh trước, hãy kiểm tra nhánh này và thử hợp nhất với chuyển tiếp nhanh. Nếu thất bại, break
được gọi và lệnh dừng ở đây.
Tất nhiên, bạn có thể thay thế git merge --ff-only
bằng git rebase
nếu đó là những gì bạn muốn.
Cuối cùng, bạn có thể đặt nó trong bashrc dưới dạng bí danh:
alias git-pull-all='git fetch --all && for branch in $(git branch | sed '\''/*/{$q;h;d};$G'\'' | tr -d "*") ; do git checkout $branch && git merge --ff-only || break ; done'
Hoặc nếu bạn sợ làm phiền với 'và ", hoặc đơn giản là bạn muốn giữ khả năng đọc cú pháp trong trình chỉnh sửa của mình, bạn có thể khai báo nó như một hàm:
git-pull-all()
{
git fetch --all && for branch in $(git branch | sed '/*/{$q;h;d};$G' | tr -d '*') ; do git checkout $branch && git merge --ff-only || break ; done
}
Tặng kem:
Đối với những người muốn giải thích về sed '/*/{$q;h;d};$G'
phần này:
/*/
=> Tìm kiếm dòng có a *
.
{$q
=> Nếu nó ở dòng cuối cùng, hãy thoát (chúng tôi không cần làm gì cả vì chi nhánh hiện tại đã là chi nhánh cuối cùng trong danh sách).
;h;d}
=> Nếu không, lưu dòng trong bộ đệm giữ và xóa nó trong vị trí danh sách hiện tại.
;$G
=> Khi đến dòng cuối cùng, nối thêm nội dung của bộ đệm giữ.