README.md |
git-tips
git小贴士:git常用命令集合(git的'奇技淫巧'?😱)
所有人看过来
-
Fork于tips项目
-
一定要先测试命令的效果后,再用于工作环境中,以防造成不能弥补的后果!
-
所有的命令都在
git version 2.7.4 (Apple Git-66)
下测试通过(安全可食用😊)
- Everyday Git in twenty commands or so
- Show helpful guides that come with Git
- Overwrite pull
- List of all files till a commit
- Git reset first commit
- List all the conflicted files
- List of all files changed in a commit
- Unstaged changes since last commit
- Changes staged for commit
- Show both staged and unstaged changes
- List all branches that are already merged into master
- Quickly switch to the previous branch
- Remove branches that have already been merged with master
- List all branches and their upstreams, as well as last commit on branch
- Track upstream branch
- Delete local branch
- Delete remote branch
- Delete local tag
- Delete remote tag
- Undo local changes with the last content in head
- Revert: Undo a commit by creating a new commit
- Reset: Discard commits, advised for private branch
- Reword the previous commit message
- See commit history for just the current branch
- Amend author.
- Reset author, after author has been changed in the global config.
- Changing a remote's URL
- Get list of all remote references
- Get list of all local and remote branches
- Get only remote branches
- Stage parts of a changed file, instead of the entire file
- Get git bash completion
- What changed since two weeks?
- See all commits made since forking from master
- Pick commits across branches using cherry-pick
- Find out branches containing commit-hash
- Git Aliases
- Saving current state of tracked files without commiting
- Saving current state including untracked files
- Show list of all saved stashes
- Apply any stash without deleting from the stashed list
- Apply last stashed state and delete it from stashed list
- Delete all stored stashes
- Grab a single file from a stash
- Show all tracked files
- Show all untracked files
- Show all ignored files
- Create new working tree from a repository (git 2.5)
- Create new working tree from HEAD state
- Untrack files without deleting
- Before deleting untracked files/directory, do a dry run to get the list of these files/directories
- Forcefully remove untracked files
- Forcefully remove untracked directory
- Update all the submodules
- Show all commits in the current branch yet to be merged to master
- Rename a branch
- rebases 'feature' to 'master' and merges it in to master
- Archive the
master
branch - Modify previous commit without modifying the commit message
- Prunes references to remote branches that have been deleted in the remote.
- Retrieve the commit hash of the initial revision.
- Visualize the version tree.
- Deploying git tracked subfolder to gh-pages
- Adding a project to repo using subtree
- Get latest changes in your repo for a linked project using subtree
- Export a branch with history to a file.
- Import from a bundle
- Get the name of current branch.
- Ignore one file on commit (e.g. Changelog).
- Stash changes before rebasing
- Fetch pull request by ID to a local branch
- Show the most recent tag on the current branch.
- Show inline word diff.
- Don’t consider changes for tracked file.
- Undo assume-unchanged.
- Clean the files from
.gitignore
. - Restore deleted file.
- Restore file to a specific commit-hash
- Always rebase instead of merge on pull.
- List all the alias and configs.
- Make git case sensitive.
- Add custom editors.
- Auto correct typos.
- Check if the change was a part of a release.
- Dry run. (any command that supports dry-run flag should do.)
- Marks your commit as a fix of a previous commit.
- squash fixup commits normal commits.
- skip staging area during commit.
- Interactive staging.
- List ignored files.
- Status of ignored files.
- Commits in Branch1 that are not in Branch2
- reuse recorded resolution, record and reuse previous conflicts resolutions.
- Open all conflicted files in an editor.
- Count unpacked number of objects and their disk consumption.
- Prune all unreachable objects from the object database.
- Instantly browse your working repository in gitweb.
- View the GPG signatures in the commit log
- Remove entry in the global config.
- Checkout a new branch without any history
- Extract file from another branch.
- List only the root and merge commits.
- Change previous two commits with an interactive rebase.
- List all branch is WIP
- Find guilty with binary search
- Bypass pre-commit and commit-msg githooks
- List commits and changes to a specific file (even through renaming)
- Clone a single branch
- Create and switch new branch
- Ignore file mode changes on commits
- Turn off git colored terminal output
- specific color settings
- Show all local branches ordered by recent commits
- Find lines matching the pattern (regex or string) in tracked files
- Clone a shallow copy of a repository
- Search Commit log across all branches for given text
- Get first commit in a branch (from master)
- Unstaging Staged file
- Force push to Remote Repository
- Adding Remote name
统一概念
- 工作区:改动(增删文件和文本)
- 暂存区:输入命令:
git add 改动的文件名
,此次改动就放到了‘暂存区’ - 本地仓库:输入命令:
git commit 此次修改的描述
,此次改动就放到了’本地仓库’,每个commit,我叫它为一个‘版本’ - 远程仓库:输入命令:
git push 远程仓库
,此次改动就放到了‘远程仓库’(github等) - commit-id:
展示帮助信息
git help -g
回到远程仓库的状态
抛弃本地仓库的所有版本(commit),回到远程仓库的状态。
git fetch --all && git reset --hard origin/master
重设第一个commit
也就是把所有的改动都重新放回工作区,并清空所有的commit,这样就可以重新提交第一个commit了
git update-ref -d HEAD
展示工作区和最近版本的不同
输出工作区和本地中最近的版本(commit)的different(不同)。
git diff
展示暂存区和最近版本的不同
输出暂存区和本地最近的版本(commit)的different(不同)。
git diff --cached
展示暂存区、工作区和最近版本的不同
输出工作区、暂存区 和本地最近的版本(commit)的different(不同)。
git diff HEAD
快速切换分支
git checkout -
删除已经合并到master的分支
git branch --merged master | grep -v '^\*\| master' | xargs -n 1 git branch -d
展示所有的分支关联的远程仓库
git branch -vv
关联远程分支
关联之后,git branch -vv
就可以展示关联的远程分支名了,同时推送到远程仓库直接:git push
,不需要指定远程仓库了。
git branch -u origin/mybranch
删除本地分支
git branch -d <local_branchname>
删除远程分支
git push origin --delete <remote_branchname>
或者
git push origin :<remote_branchname>
删除本地标签(tag)
git tag -d <tag-name>
删除远程标签(tag)
git push origin :refs/tags/<tag-name>
放弃工作区的修改
git checkout <file_name>
放弃所有修改:
git checkout .
回到某一个commit的状态,并重新增添一个commit
git revert <commit-id>
回到某个commit的状态,并删除后面的commit
和revert的区别:reset命令会抹去某个commit id之后的所有commit
git reset <commit-id>
修改上一个commit的描述
git commit --amend
查看commit历史
git log
修改作者名
git commit --amend --author='Author Name <email@address.com>'
修改远程仓库的url
git remote set-url origin <URL>
列出所有远程仓库
git remote
列出本地和远程分支
-a参数相当于:all
git branch -a
列出远程分支
-r参数相当于:remote
git branch -r
查看两个星期内的改动
git whatchanged --since='2 weeks ago'
把A分支的某一个commit,放到B分支上
这个过程需要cherry-pick
命令,参考
git checkout <branch-name> && git cherry-pick <commit-id>
给git命令起别名
简化命令
git config --global alias.<handle> <command>
比如:git status 改成 git st,这样可以简化命令
git config --global alias.st status
存储当前的修改,但不用提交commit
详解可以参考廖雪峰老师的git教程
git stash
保存当前状态,包括untracked的文件
untracked文件:新建的文件
git stash -u
展示所有stashes
git stash list
回到某个stash的状态
git stash apply <stash@{n}>
回到最后一个stash的状态,并删除这个stash
git stash pop
删除所有的stash
git stash clear
从stash中拿出某个文件的修改
git checkout <stash@{n}> -- <file_path>
Show all tracked files
git ls-files -t
Show all untracked files
git ls-files --others
Show all ignored files
git ls-files --others -i --exclude-standard
Create new working tree from a repository (git 2.5)
git worktree add -b <branch-name> <path> <start-point>
Create new working tree from HEAD state
git worktree add --detach <path> HEAD
Untrack files without deleting
git rm --cached <file_path>
Alternatives:
git rm --cached -r <directory_path>
Before deleting untracked files/directory, do a dry run to get the list of these files/directories
git clean -n
Forcefully remove untracked files
git clean -f
Forcefully remove untracked directory
git clean -f -d
Alternatives:
git clean -df
Update all the submodules
git submodule foreach git pull
Alternatives:
git submodule update --init --recursive
git submodule update --remote
Show all commits in the current branch yet to be merged to master
git cherry -v master
Alternatives:
git cherry -v master <branch-to-be-merged>
Rename a branch
git branch -m <new-branch-name>
Alternatives:
git branch -m [<old-branch-name>] <new-branch-name>
rebases 'feature' to 'master' and merges it in to master
git checkout feature && git rebase @{-1} && git checkout @{-2} && git merge @{-1}
Archive the master
branch
git archive master --format=zip --output=master.zip
Modify previous commit without modifying the commit message
git add --all && git commit --amend --no-edit
Prunes references to remote branches that have been deleted in the remote.
git fetch -p
Alternatives:
git remote prune origin
Retrieve the commit hash of the initial revision.
git rev-list --reverse HEAD | head -1
Visualize the version tree.
git log --pretty=oneline --graph --decorate --all
Alternatives:
gitk --all
Deploying git tracked subfolder to gh-pages
git subtree push --prefix subfolder_name origin gh-pages
Adding a project to repo using subtree
git subtree add --prefix=<directory_name>/<project_name> --squash git@github.com:<username>/<project_name>.git master
Get latest changes in your repo for a linked project using subtree
git subtree pull --prefix=<directory_name>/<project_name> --squash git@github.com:<username>/<project_name>.git master
Export a branch with history to a file.
git bundle create <file> <branch-name>
Import from a bundle
git clone repo.bundle <repo-dir> -b <branch-name>
Get the name of current branch.
git rev-parse --abbrev-ref HEAD
Ignore one file on commit (e.g. Changelog).
git update-index --assume-unchanged Changelog; git commit -a; git update-index --no-assume-unchanged Changelog
Stash changes before rebasing
git rebase --autostash
Fetch pull request by ID to a local branch
git fetch origin pull/<id>/head:<branch-name>
Alternatives:
git pull origin pull/<id>/head:<branch-name>
Show the most recent tag on the current branch.
git describe --tags --abbrev=0
Show inline word diff.
git diff --word-diff
Don’t consider changes for tracked file.
git update-index --assume-unchanged <file_name>
Undo assume-unchanged.
git update-index --no-assume-unchanged <file_name>
Clean the files from .gitignore
.
git clean -X -f
Restore deleted file.
git checkout <deleting_commit>^ -- <file_path>
Restore file to a specific commit-hash
git checkout <commit-ish> -- <file_path>
Always rebase instead of merge on pull.
git config --global branch.autosetuprebase always
List all the alias and configs.
git config --list
Make git case sensitive.
git config --global core.ignorecase false
Add custom editors.
git config --global core.editor '$EDITOR'
Auto correct typos.
git config --global help.autocorrect 1
Check if the change was a part of a release.
git name-rev --name-only <SHA-1>
Dry run. (any command that supports dry-run flag should do.)
git clean -fd --dry-run
Marks your commit as a fix of a previous commit.
git commit --fixup <SHA-1>
squash fixup commits normal commits.
git rebase -i --autosquash
skip staging area during commit.
git commit --only <file_path>
展示忽略的文件
git status --ignored
commit历史中显示Branch1有的,但是Branch2没有commit
git log Branch1 ^Branch2
reuse recorded resolution, record and reuse previous conflicts resolutions.
git config --global rerere.enabled 1
Open all conflicted files in an editor.
git diff --name-only | uniq | xargs $EDITOR
Count unpacked number of objects and their disk consumption.
git count-objects --human-readable
Prune all unreachable objects from the object database.
git gc --prune=now --aggressive
Instantly browse your working repository in gitweb.
git instaweb [--local] [--httpd=<httpd>] [--port=<port>] [--browser=<browser>]
在commit log中显示GPG签名
git log --show-signature
删除全局设置
git config --global --unset <entry-name>
新建并切换到新分支上,同时这个分支没有任何commit
相当于保存修改,但是重写commit历史
git checkout --orphan <branch_name>
Extract file from another branch.
git show <branch_name>:<file_name>
List only the root and merge commits.
git log --first-parent
Change previous two commits with an interactive rebase.
git rebase --interactive HEAD~2
List all branch is WIP
git checkout master && git branch --no-merged
Find guilty with binary search
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
Bypass pre-commit and commit-msg githooks
git commit --no-verify
List commits and changes to a specific file (even through renaming)
git log --follow -p -- <file_path>
Clone a single branch
git clone -b <branch-name> --single-branch https://github.com/user/repo.git
Create and switch new branch
git checkout -b <branch-name>
Alternatives:
git branch <branch-name> && git checkout <branch-name>
Ignore file mode changes on commits
git config core.fileMode false
Turn off git colored terminal output
git config --global color.ui false
specific color settings
git config --global <specific command e.g branch, diff> <true, false or always>
Show all local branches ordered by recent commits
git for-each-ref --sort=-committerdate --format='%(refname:short)' refs/heads/
Find lines matching the pattern (regex or string) in tracked files
git grep --heading --line-number 'foo bar'
Clone a shallow copy of a repository
git clone https://github.com/user/repo.git --depth 1
Search Commit log across all branches for given text
git log --all --grep='<given-text>'
Get first commit in a branch (from master)
git log master..<branch-name> --oneline | tail -1
把暂存区的内容放到工作区中
git reset <file-name>
强制推送
git push -f <remote-name> <branch-name>
增加远程仓库
git remote add origin <remote-url>