GitHub - hprobotic/git-tips: Những lệnh git cơ bản

Tuyển tập git-tips, bạn muốn đóng góp thêm? Vui lòng xem chi tiết contributing.md

English | 中文 | Русский | 한국어 | Tiếng Việt

Công cụ:

P.S: Tất cả các câu lệnh dưới đây đã được kiểm tra bằng git version 2.7.4 (Apple Git-66).

Sử dụng

Show helpful guides that come with Git

Tìm kiếm thay đổi bằng nội dung

git log -S'<a term in the source>'

Đồng bộ với remote, ghi đè tất cả những thay đổi hiện tại

git fetch origin && git reset --hard origin/master && git clean -f -d

Danh sách tất cả các tệp trong 1 commit

git ls-tree --name-only -r <commit-ish>

Git reset first commit

Danh sách tất cả tệp đã bị conflict

git diff --name-only --diff-filter=U

Danh sách tất cả các file đã bị thay đổi trong 1 commit

git diff-tree --no-commit-id --name-only -r <commit-ish>

Tất cả những thay đổi chưa được ghi nhận kể từ commit cuối cùng

Những thay đổi đã được ghi nhận

Cách khác:

Xem mọi thay đổi trên tệp kể từ commit cuối

Danh sách tất cả các branch đã được merged vào master

git branch --merged master

Quay lại branch gần nhất

Cách khác:

Xóa tất cả branch đã được merged vào master

git branch --merged master | grep -v '^\*' | xargs -n 1 git branch -d

Cách khác:

git branch --merged master | grep -v '^\*\|  master' | xargs -n 1 git branch -d # will not delete master if master is not checked out

Danh sách tất cả branch và thông tin cơ bản: upstream, commit gần nhất

Thông tin về upstream của branch

git branch -u origin/mybranch

Xóa một branch trên máy

git branch -d <local_branchname>

Xóa một remote branch

git push origin --delete <remote_branchname>

Cách khác:

git push origin :<remote_branchname>

Xóa một tag trên máy

Xóa một remote tag

git push origin :refs/tags/<tag-name>

Undo local changes with the last content in head

git checkout -- <file_name>

Revert: Hủy bỏ một commit bằng cách tạo thêm 1 commit

Reset: Hủy bỏ tất cả commit, khuyên dùng cho branch cá nhân

Sửa lại commit message gần vừa tạo

Xem lịch sử commit riêng branch hiện tại

Người thay đổi.

git commit --amend --author='Author Name <email@address.com>'

Reset tác giả, sau khi tác giả đã bị thay đổi trong cấu hình toàn hệ thống.

git commit --amend --reset-author --no-edit

Thay đổi đường dẫn remote

git remote set-url origin <URL>

Lấy danh sách của tất các remote

Cách khác:

Lấy danh sách branch trên local và remote

Chỉ lấy danh sách branch trên remote

Lưu thay đổi 1 phần của tệp, thay vì toàn bộ tệp

Lấy câu lệnh git tự động hoàn thành

curl http://git.io/vfhol > ~/.git-completion.bash && echo '[ -f ~/.git-completion.bash ] && . ~/.git-completion.bash' >> ~/.bashrc

Những gì đã thay đổi trong 2 tuần gần nhất?

git log --no-merges --raw --since='2 weeks ago'

Cách khác:

git whatchanged --since='2 weeks ago'

Xem tất cả những commit đã được tạo từ khi fork từ master

git log --no-merges --stat --reverse master..

Chọn các commit từ nhiều branch sử dụng cherry-pick

git checkout <branch-name> && git cherry-pick <commit-ish>

Tìm cách branch có chứa commit-hash

git branch -a --contains <commit-ish>

Cách khác:

git branch --contains <commit-ish>

Gõ tắt Git

git config --global alias.<handle> <command> 
git config --global alias.st status

Lưu trạng thái hiện tại của các tệp mà không commit

Cách khác:

Lưu trạng thái hiện tại của những thay đổi chưa được lưu vào những tệp đã được theo dõi

Cách khác:

git stash save --keep-index

Lưu trạng thái hiện tại bao gồm cả tệp chưa được theo dõi

Cách khác:

git stash save --include-untracked

Lưu trạng thái hiện tại với message

Lưu trạng thái hiện tại của tất cả file (bị bỏ qua, chưa được theo dõi, và được theo dõi)

Cách khác:

Xem danh sách tất cả các lưu tạm

Áp dụng lưu tạm bất kỳ mà không xóa nó hỏi danh sách lưu tạm

git stash apply <stash@{n}>

Áp dụng lưu tạm cuối cùng và xóa nó khỏi danh sách lưu tạm

Cách khác:

git stash apply stash@{0} && git stash drop stash@{0}

Xóa tất cả lưu tạm

Cách khác:

git stash drop <stash@{n}>

Lấy 1 file từ 1 lưu tạm

git checkout <stash@{n}> -- <file_path>

Cách khác:

git checkout stash@{0} -- <file_path>

Hiển thị danh sách tệp được theo dõi

Hiển thị danh sách tệp chưa được theo dõi

Hiển thị danh sách tệp bị bỏ qua

git ls-files --others -i --exclude-standard

Tạo nhánh làm việc mới từ một repo (git 2.5)

git worktree add -b <branch-name> <path> <start-point>

Tạo một nhánh làm việc mới từ trạng thái HEAD

git worktree add --detach <path> HEAD

Hủy bỏ theo dõi tệp mà không xóa nó

git rm --cached <file_path>

Cách khác:

git rm --cached -r <directory_path>

Trước khi xóa những tệp/ thư mục chưa được theo dõi, thực thi việc lấy danh sách các tệp/ thư mục này

Force: Xóa bỏ tất cả tệp chưa được theo dõi

Force: Xóa bỏ tất cả thư mục chưa được theo dõi

Cập nhật tất cả submodule

git submodule foreach git pull

Cách khác:

git submodule update --init --recursive
git submodule update --remote

Hiển thị tất cả các commit chưa được merged vào master của branch hiện tại

Cách khác:

git cherry -v master <branch-to-be-merged>

Đổi tên một branch

git branch -m <new-branch-name>

Cách khác:

git branch -m [<old-branch-name>] <new-branch-name>

Rebases 'feature' thành 'master' và merges nó vào master

git rebase master feature && git checkout master && git merge -

Khóa branch master

git archive master --format=zip --output=master.zip

Thay đổi commit gần nhất mà không thay đổi commit message

git add --all && git commit --amend --no-edit

Truy vấn đến cho các nhánh remote mà nó đã bị xóa trong remote.

Cách khác:

Truy xuất commit-hash của bản sửa đổi ban đầu.

 git rev-list --reverse HEAD | head -1

Cách khác:

git rev-list --max-parents=0 HEAD
git log --pretty=oneline | tail -1 | cut -c 1-40
git log --pretty=oneline --reverse | head -1 | cut -c 1-40

Xem cây commit theo dạng đồ họa

git log --pretty=oneline --graph --decorate --all

Cách khác:

Deploy một thư mục đã được theo dõi vào gh-pages

git subtree push --prefix subfolder_name origin gh-pages

Thêm một dự án vào repo sử dụng subtree

git subtree add --prefix=<directory_name>/<project_name> --squash git@github.com:<username>/<project_name>.git master

Lấy thay đổi mới nhất trong repo của bạn cho một dự án đã được liên kết dùng subtree

git subtree pull --prefix=<directory_name>/<project_name> --squash git@github.com:<username>/<project_name>.git master

Xuất một branch với lịch sử ra một tệp

git bundle create <file> <branch-name>

Nhập từ một bundle

git clone repo.bundle <repo-dir> -b <branch-name>

Lấy tên của branch hiện tại

git rev-parse --abbrev-ref HEAD

Bỏ qua 1 file trong commit (e.g. Changelog).

git update-index --assume-unchanged Changelog; git commit -a; git update-index --no-assume-unchanged Changelog

Lưu tạm các thay đổi trước khi rebase

Cập nhật yêu cầu tích hợp bằng ID vào local branch

git fetch origin pull/<id>/head:<branch-name>

Cách khác:

git pull origin pull/<id>/head:<branch-name>

Hiển thị tag gần nhất trên branch hiện tại.

git describe --tags --abbrev=0

Hiển thị thay đổi tổng quát.

Hiển thị thay đổi sử dụng các công cụ.

git difftool -t <commit1> <commit2> <path>

Không xem xét các thay đổi cho tệp đã theo dõi.

git update-index --assume-unchanged <file_name>

Hủy assume-unchanged.

git update-index --no-assume-unchanged <file_name>

Dọn dẹp các tệp từ .gitignore.

Khôi phục tệp đã bị xóa.

git checkout <deleting_commit>^ -- <file_path>

Khôi phục một file từ một commit-hash nhất định

git checkout <commit-ish> -- <file_path>

Luôn rebase thay vì tích hợp khi pull.

git config --global pull.rebase true

Cách khác:

#git < 1.7.9
git config --global branch.autosetuprebase always

Danh sách tất cả các lối tắt và cấu hình.

Cấu hình git phân biệt chữ hoa chữ thường

git config --global core.ignorecase false

Thêm trình soạn thảo của bạn.

git config --global core.editor '$EDITOR'

Tự động sửa lỗi chính tả.

git config --global help.autocorrect 1

Kiểm tra nếu thay đổi đã là một phần của xuất bản.

git name-rev --name-only <SHA-1>

Dry run. (tất cả các câu lệnh hộ trợ dry-run được gắn cờ nên sử dụng.)

Gán commit của bạn là 1 fix của commit trước đó.

git commit --fixup <SHA-1>

Squash fixup commits normal commits.

git rebase -i --autosquash

Bỏ qua khu vực dàn trong quá trình commit.

git commit --only <file_path>

Interactive staging.

Danh sách tệp bị bỏ qua.

Trạng thái của tệp bị bỏ qua.

Các commit ở Branch1 mà không có ở Branch2

Danh sách n commit gần nhất

Cách khác:

Reuse recorded resolution, record and reuse previous conflicts resolutions.

git config --global rerere.enabled 1

Mở tất cả những tệp bị conflict bằng trình soạn thảo.

git diff --name-only | uniq | xargs $EDITOR

Đếm số đối tượng và dung lượng ổ đĩa của file đã giải nén

git count-objects --human-readable

Xoá tất cả các đối tượng không thể truy cập từ cơ sở dữ liệu đối tượng.

git gc --prune=now --aggressive

Chuyển đến repo của bạn trên gitweb bằng trình duyệt.

git instaweb [--local] [--httpd=<httpd>] [--port=<port>] [--browser=<browser>]

View the GPG signatures in the commit log

Xóa bỏ mục trong cấu hình toàn hệ thống.

git config --global --unset <entry-name>

Khởi tạo một branch mới không có lịch sử

git checkout --orphan <branch_name>

Xem tệp của branch khác.

git show <branch_name>:<file_name>

Chỉ liệt kê commit gốc và đã merge.

Thay đổi 2 commit với một interactive rebase.

git rebase --interactive HEAD~2

Danh sách tất cả branch là WIP

git checkout master && git branch --no-merged

Tìm lỗi với tìm kiếm nhị phân

git bisect start                    # Search start 
git bisect bad                      # Set point to bad commit 
git bisect good v2.6.13-rc2         # Set point to good commit|tag 
git bisect bad                      # Say current state is bad 
git bisect good                     # Say current state is good 
git bisect reset                    # Finish search 

Bỏ qua pre-commitcommit-msg khi commit

Danh sách các commit và thay đổi cho 1 file nhất định (kể cả file đã đổi tên)

git log --follow -p -- <file_path>

Clone 1 branch duy nhất

git clone -b <branch-name> --single-branch https://github.com/user/repo.git

Tạo và chuyển qua branch mới ngay lập tức

git checkout -b <branch-name>

Cách khác:

git branch <branch-name> && git checkout <branch-name>

Bỏ qua kiểu thay đổi tệp trên các commit

git config core.fileMode false

Tắt giao diện màu trong terminal

git config --global color.ui false

Chỉ định cấu hình màu theo branch, diff..

git config --global <specific command e.g branch, diff> <true, false or always>

Hiển thị tất cả các branch đã xếp đặt trong các commit gần đây

git for-each-ref --sort=-committerdate --format='%(refname:short)' refs/heads/

Tìm các dòng thỏa điều kiện (regex hoặc chuỗi) trong những tệp được theo dõi

git grep --heading --line-number 'foo bar'

Clone một sao chép bóng của repo

git clone https://github.com/user/repo.git --depth 1

Tìm kiếm lịch sử commit trên toàn bộ branch bằng một từ khóa cho trước

git log --all --grep='<given-text>'

Lấy commit đầu tiên trong một branch (từ master)

git log master..<branch-name> --oneline | tail -1

Hủy lưu thay đổi tệp

git reset HEAD <file-name>

Đẩy lên remote repo và bỏ qua mọi vật cản

git push -f <remote-name> <branch-name>

Thêm tên Remote

git remote add <remote-nickname> <remote-url>

Hiển thị tác giả, thời gian và bản ghi gần nhất lên từng dòng của 1 file cho trước

Nhóm các commit theo các tác giả và tiêu đề

Forced push nhưng vẫn đảm bảo bạn không ghi đè lên những thay đổi của người khác

git push --force-with-lease <remote-name> <branch-name>

Hiển số dòng đóng góp của một tác giả

git log --author='_Your_Name_Here_' --pretty=tformat: --numstat | gawk '{ add += <!-- @doxie.inject start -->; subs += <!-- @doxie.inject end -->; loc += <!-- @doxie.inject start --> - <!-- @doxie.inject end --> } END { printf "added lines: %s removed lines: %s total lines: %s
", add, subs, loc }' -

Cách khác:

git log --author='_Your_Name_Here_' --pretty=tformat: --numstat | awk '{ add += <!-- @doxie.inject start -->; subs += <!-- @doxie.inject end -->; loc += <!-- @doxie.inject start --> - <!-- @doxie.inject end --> } END { printf "added lines: %s, removed lines: %s, total lines: %s
", add, subs, loc }' - # on Mac OSX

Revert: Hoàn nguyên toàn bộ một merge

git revert -m 1 <commit-ish>

Số lượng commit trong 1 branch

git rev-list --count <branch-name>

Gõ tắt: git undo

git config --global alias.undo '!f() { git reset --hard $(git rev-parse --abbrev-ref HEAD)@{${1-1}}; }; f'

Thêm các ghi chú

git notes add -m 'Note on the previous commit....'

Hiển thị tất cả git-notes

Áp dụng commit từ một repo khác

git --git-dir=<source-dir>/.git format-patch -k -1 --stdout <SHA1> | git am -3 -k

Fetch từ một ref nhất định

git fetch origin master:refs/remotes/origin/mymaster

Tìm gốc chung của 2 nhánh

diff -u <(git rev-list --first-parent BranchA) <(git rev-list --first-parent BranchB) | sed -ne 's/^ //p' | head -1

Danh sách commit chưa push

git log --branches --not --remotes

Cách khác:

Thêm mọi thứ, nhưng bỏ qua thay đổi khoảng trắng

git diff --ignore-all-space | git apply --cached

Chỉnh [local/global] git config

git config [--global] --edit

Xem blame trong một khoảng nhất định

git blame -L <start>,<end>

Xem một biến Git logical

Tệp vá lỗi được định dạng sẵn.

git format-patch -M upstream..topic

Lấy tên repo.

git rev-parse --show-toplevel

Xem logs trong một khoảng ngày tháng

git log --since='FEB 1 2017' --until='FEB 14 2017'

Xem logs ngoại trừ tác giả

git log --perl-regexp --author='^((?!excluded-author-regex).*)

Tạo ra một bản tóm tắt các thay đổi đang chờ

git request-pull v1.0 https://git.ko.xz/project master:for-linus

Danh sách các ref trong remote repository

git ls-remote git://git.kernel.org/pub/scm/git/git.git

Sao lưu những file không được theo dõi.

git ls-files --others -i --exclude-standard | xargs zip untracked.zip

Danh sách các lệnh gõ tắt

git config -l | grep alias | sed 's/^alias\.//g'

Cách khác:

git config -l | grep alias | cut -d '.' -f 2

Hiển thị trạng thái git ở dạng rút gọn

git status --short --branch

Quay về một commit tại 1 thời điểm nhất định trong quá khứ

git checkout master@{yesterday}

Đẩy một branch từ local lên remote và theo dõi

git push -u origin <branch_name>