虽然一直有使用git,但是一直也仅仅是使用了有限的几个命令,最近用两天时间整理了下工作中可能用到的git指令,放在这里作为以后的参考:
git工具主要包含以下指令:
version
config
add // staging(cache)当前修改到 INDEX(暂且理解为缓存区)
am // apply + commit, 套用patch并且commit
apply // 套用patch
branch //用于分支的管理,包括新建,删除,重命名等常用操作
checkout //用于分支的切换
clone //拷贝Repository
commit //提交修改
diff //比较工具
fetch // 获取远端分支的修改
format-patch // 生成patch
init //初始化git
log //查看log
mv //重命名
pull // fetch + merge, 获取远端分支的修改并合并
push // 推送当前分支的修改到远端的repository
rebase // 重定基
reset // 取消指定的commit,或者取消stage
revert // 反转提交
rm // 删除文件,并且把删除文件的操作添加到stage中
show // 查看commit,tag等详细信息
stash // 一个缓存机制
status // 查看git状态
gitk //图形化界面查看当前分支的所有comit,类似与gitlog的GUI版本
大部分git命令需要当前目前目录(或者当前目录的祖先目录)存在.git文件夹才能执行,除了以下情形:
1. git config --global XXXX XXXX //git 全局设置
2. git init //初始化git
3. git clone // 拷贝repository
以下记录一些比较有用的命令和参数:
git config [--global] user.name xxx //设定用户命
git config [--global] user.email xxx //设定用户邮箱
git config [--global] color.ui auto // 设定颜色方案为auto
git init --bare //初始化一个git repository,该仓库为裸库,不包含work tree(即该repository仅作为服务器使用,默认不提供编辑功能)。
PS : 该命令不会在当前目录下创建.git文件夹,而是生成branches、hooks、info、objects、refs文件夹和config、description、HEAD文件。其实,这些内容就是.git文件夹内的内容,因为bare库并非工作空间,所以git把这些内容显示的显示出来了,而不是隐藏在.git文件夹内。
再PS: 确定一个repository是否为bare库的关键在于core.bare属性(boolean型属性)。core.bare属性可以有git config命令设置,也可以通过修改config文件的方式设置。
git remote add origin
ssh://xxxxxx //添加remote
git status //查看状态:包括三种文件的状态:untracking (未纳入版本控制的文件), unstaged(纳入了版本控制,但是未保存到index中的),staged(已保存到index中)
git init //在根目录创建一个.git文件夹,用于把当前目录下的文件纳入git管理。
git clone ssh://xxxxxxx [-b master] //拷贝repository到本地
PS: -b参数可以指定分支,git会在本地创建指定的同名分支,并且track origin上的对应分支。
再PS: 如果未指定-b参数,则git会在本地创建origin上的当前分支的同名分支,并建立trach关系。
git branch //查看本地分支
git branch -r // 查看远端分支
git branch -a // 查看所有分支(包括本地和远端)
git branch -avv // 查看所有分支,并显示track关系
git branch master // 创建master 分子
git branch mv master1 master2 //重命名master1分支为master2分支
git branch [-d|-D] master //删除master分支,-D为强制删除
git branch --track origin/master master //创建一个master分支,此分支track origin服务器上的master分支
git check out master //检出master分支
git checkout --track origin/master -b master //
git branch --track origin/master master + checkout master
git checkout <file> //恢复work tree上的修改到HEAD,已经staged的修改会被保留
git checkout . //恢复所有纳入版本控制的文件的修改到HEAD,已经staged的修改会被保留
git add 123.txt // 添加123.txt文件的修改到index, 如果123.txt为untrack(123.txt为新文件,未纳入版本控制),则在index中添加new记录。
git add . // 添加当前目录下所有new,和motify修改到index中
git rm 123.txt // 删除123.txt文件,并且在index中添加delete记录。
git commit // 提交stage中的修改
git commit -a // git add . + git commit
git commit -m "xxxxx" // 以指定的信息为log,若未指定-m参数,则打开im(vim?)输入log
git commit -am “xxxxx” // git commit -a -m “xxxxx”
git diff <file name>// 比较当前work tree和index之间的差别
git diff --chached //比较当前index与HEAD之间的差别
git diff --staged // 同 --chached
git giff <comit1> <commit2> //比较两次commit之间的差异
git push [-u] origin master // 推送当前分支上的修改到origin的master分支, -u 参数为可选,
可以建立tracking关系,执行一次以后,可以用git push不带餐推送修改
git push // 根据tracker关系,推送修改到remote端
git pull origin master // 提取origin的修改到当前本地分支上
git pull //根据tracker关系,提取remote端修改,并merge到当前分支
git revert HEAD~3 //反转提交最近的第4个commit(反转最近的commit为 git revert HEAD)
git revert HEAD commit1 commit2 //反转提交 commit1 和commit2
git revert HEAD commit1..commit2 //反转提交commit1(不包括)到commit2(包括)之间的commit
PS: 反转提交是指,生成一个新的commit,该commit的内容与指定的commit内容相反。
git reset // 把index内的修改返回到work tree中,相当与git add .的反操作,并不影响work tree中文件的内容
git reset --soft HEAD~2 // 取消最近第2次commit以来的所有commit,并将commit的修改保存在index中,worktree不受影响
git reset --hard HEAD~2 // 取消最近2次commit以来的所有commit,清空index,并将work tree恢复到最近的第3次commit以后的状态
git stash // 保存当前work tree的修改和index的修改,并恢复work tree 到HEAD状态
git stash pop // 提取并应用stash中保存的修改
git stash clear // 清空缓存的stash修改
git rebase master test // master分支重定基到test分支上,以如下步骤进行:
1. 首先寻找到test和master上重合的最后一个commit0,
2. 把master分支恢复到commit0的状态,保存master分支上从commit0开始的所有commit
3. 从commit0开始,把test分支从commit0开始的所有commit依次应用到master分支上
4. 把刚才保存的master分支上所有从commit0开始的commit依次应用到master分支上
git merge test //把test分支合并到当前分支上
git mergetool //调用merge工具解决conflicts
PS: mergetool 命令会调用 merge.tool 所指定的工具来,可以用git config设定
git format-patch -1 //产生最近一个commit的patch
git format-patch master //产生所有当前分支上有,但是在master上没有的commit的patch
git am <patch-file> //应用patch 文件,并commit
PS: 如果执行git am <patch-file> 发生
previous rebase directory ../.git/rebase-apply still exists but mbox given错误,
可以先执行git am --abort后再执行git am