Git使用总结。
常用Git总结
Git config
git config
配置的三个等级,优先级大小如下--system
<--global
<--local
本地为最高优先级,系统配置为最低优先级,在文件中的位置分别是/etc/gitconfig
,~/.gitconfig
,和自己项目中。
配置用户名:git config --global user.name "Jack"
配置邮箱:git config --global user.email "xuwenjiejack@gmail.com"
自定义Git输出颜色:git config --system color.ui auto
Note:如果你在
local
和global
中都设置了用户名和邮箱,而且是不同的,在你使用这个项目中使用的是local
的配置
Git clone
Clone一个项目到本地(ssh/https):git clone [ssh/https]
在Github上默认会clone一个master分支到本地
Clone指定分支到本地:git clone -b [branch] [ssh/https]
Git init
初始化一个本地仓库:git init
初始化一个裸仓库:git init --bare xxx.git
Git status
查看本地文件的状态:git status
Note:会显示哪些文件添加,修改,删除。
Git add
添加所有状态改变的文件到暂存区等待提交:git add .
添加指定文件或者文件夹下所有状态改变的文件到暂存区:git add [<fileName/filePath>...]
Note:撤销添加到暂存区的文件或者文件夹
git rm --cached [<fileName/filePath>...]
Git submodule add
添加一个子模块:
现在我需要将博客的原文件单独进行版本控制,但是又不能脱离博客(Github需要_posts目录底下的文件来进行生成网页),所以将Blog作为博客的子模块
- 添加一个子模块:
Git submodule add https://github.com/XWJACK/Blog
,会在目录底下生成一个.gitmodules
文件,并会clone子模块。将Blog
目录下的文件全部移动到_posts
目录下。 - 修改生成的
.gitmodules
文件,修改目录位置:path = _posts
- 修改子模块配置:
.git/modules/Blog/config
,修改目录位置:worktree = ../../../_posts
Git commit
提交:git commit
提交简短的Information:git commit -m "Information"
添加所有修改的文件并提交:git commit -am "Information"
修改最后一次提交的Information:git commit --amend
Git diff
查看工作树和暂存区的差别:git diff
Note:如果
git add .
之后执行,结果会什么都不显示,因为工作树没有修改的部分。
查看暂存区和提交的差别:git diff HEAD
查看最近两次提交的差别:git diff HEAD~2
Git branch
显示当前所在分支:git branch
显示所有分支(包括远程分支):git branch -a
删除本地指定分支:git branch -d [branch]
删除一个远程分支:git push origin :[branch]
或者git push origin --delete [branch]
Git checkout
快捷切换到上一个分支:git checkout -
Note:如果本地就两个分支,那么就可以快速切换,不用再写分支名。
切换指定分支:git checkout [branch]
从当前分支处新建一个分支:git checkout -b [branch]
获取远程指定分支:git checkout -b [branch] origin/[branch]
从本地指定的Tag创建一个分支:git checkout -b [branch] [tag]
获取远程tag:git fetch origin tag [tag]
Note:从远程的tag创建一个分支,需要先获取远程tag,然后再从本地tag创建一个分支。
Git remote
git remote -v
: 显示远程信息
git remote add [name] [url]
: 添加远程信息
git remote remove [name]
: 删除远程信息
Example:
git remote add origin https://github.com/XWJACK/Blog.git
Git tag
列出当前所有的Tag:git tag
新建一个Tag并写出详情:git tag -a [tag] -m "my version 1.0.0"
新建一个Tag:git tag [tag]
删除一个Tag:git tag -d [tag]
删除远程的一个Tag:git push origin tag —delete [tag]
Git push
push当前分支到远程:git push
push所有分支到远程:git push --all
Note:Git 2.x 的默认行为就是push当前分支到远程。这个也可以在config中配置 simple:push当前分支到远程,matching:push所有分支到远程:
[push]
default = simple
default = matching
push当前分支到远程(在远程新建一个分支):git push origin [branch]
,git push origin [branch]:[branch]
push local branch to remote branch
Note:一般我们在远程新建一个分支的时候会加上
-u
的参数,将origin的branch设置为本地仓库当前分支的上游(upstream)所以我们新建分支应该这样:
git push -u origin [branch]
新建分枝如果直接push会提示git push --set-upstream origin [branch]
,道理是一样的。
push一个Tag到远程分支:git push origin [tag]
一次性push所有的Tag到远程:git push origin --tags
Note:当远程主机的版本比本地版本新的时候,push会报错,这个时候我们采用:
git push --force origin
,一般我们在本地删除一个commit然后也想在远程主机上删除的时候就可以采用。
Git fetch
获得所有分支的更新:git fetch
获得所有分支的更新:git fetch origin
获取指定分支的更新:git fetch origin [branch]
Note:访问下载更新的分支,用origin/[branch]
一般我们
git fetch
一个分支之后查看没有问题,就会git merge origin/[branch]
分支,将最新的更新信息归并到指定的分支。
Git merge
归并一个分支:git merge [branch]
明确显示从这个点开始归并一个分支:git merge --no-ff [branch]
Note:推荐使用
--no-ff
参数来明确表示这个点归并了其他分支。
Git pull
获取更新数据并合并到当前分支:git pull
Note:相当于
git fetch origin
,git merge origin/[branch]
Git reset
回溯到指定版本(并将之后提交的修改返回到工作树区):git reset [hash]
回溯到指定版本:git reset --hard [hash]
Note:–hard是一个危险的操作,提交之后的东西都会消失。[hash]一般只要4位以上就可以。
git revert
回滚指定提交:git revert [hash]
Git log
查看提交日志:git log
以图表的形式显示:git log --graph
Note:
git log
只能显示到最后一次提交的信息。如果我们使用
git reset [hash]
回溯到之前的版本,那么我们就看不到回溯点之后的信息。这个时候我们应该使用
git reflog
来显示git操作的历史。
Git rebase
归并一个分支:git rebase [branch]
压缩两次提交历史:git rebase -i HEAD~3
Note:
git rebase [branch]
和git merge [branch]
的区别就是,git rebase [branch]
在归并的时候会按提交的时间顺序归并。当我们想将最近的两次commit压缩成一个commit:
git rebase -i HEAD~3
。这个时候会显示三次提交,只要将最后一个提交的的pick改成fixup就可以。
Git stash
储藏当前修改:git stash
列出所有储藏:git stash list
应用储藏:git stash apply
应用指定的储藏:git stash apply stash@{[index]}
Note:当我们在一个分支上进行修改了一部分内容之后,想切换分支,但是不想将完成一半的工作提交,这个时候我们采用
git stash
来储藏所有修改,再切换到其他分支上进行工作。工作完成之后返回当前分支,想将之前完成一半的工作继续完成,采用
git stash apply
来应用最新的一次储藏或者git stash apply stash@{[index]}
应用指定的储藏。
Advance
hooks
post-receive
1 |
|
Git cherry-pick
当我们在A分支提交了几个commit,但是想将这几个提交点提交到B分支上。
1.一个commit:git cherry-pick <commit id>
2.一个commit保留原作者信息:git cherry-pick -x <commit id>
3.一个分支:git cherry-pick master
Git Convenience
自定义快捷命令:git config --system alias.xlog 'log --graph'
,这样我们以后直接使用git xlog
撤销修改:git checkout -- [<fileName/filePath>...]
Note:当我们修改一个文件之后(还没有
git add
),想放弃修改就可以撤销修改。当我们修改文件并
git add
之后,想放弃修改并返回到为add的状态
git reset HEAD [<fileName/filePath>...]
显示最近两次提交的差别:git log -p -2
只显示一行:git log --pretty=oneline
按特定格式显示:git log --pretty=format:"%h %s" --graph
显示每一个分支的最后一次提交信息:git branch -v
最后发一下我的Git配置:
git config --system alias.xlog 'log --graph'
git config --system alias.xmerge 'merge --no-ff'
git config --system alias.xrebase3 'rebase -i HEAD~3'
git config --system alias.xcommit 'commit --amend'
git config --system alias。Rtag 'push origin tag --delete'
git config core.filemode false
Note: 不记录文件权限的改变
Github常用操作:
- 如何同步fork来的repository
git remote -v 显示所有的远程信息,找到源repository [name]
git fetch [name]/[branch]
git checkout master
git merge [name]/[branch]
Note: 最后一步也可以用
git merge --no-ff [name]/[branch]
来明确一个merge
如果想用命令行操作GitHub,建议使用 Hub