文章目的
在学习了廖雪峰的git教程中一些常见的git命令后,觉得有必要把他们记录下来,就有了这文章,仅作为记录使用。很多命令都可以使用 –help 后缀来获取帮助。
版本回退
此回退操作的前提是没有推送到远程仓库。
git log
- 显示从最近到最远的
commit提交日志 --pretty=oneline每个提交以单行显示
HEAD版本
HEAD当前版本,上一个版本HEAD^,上上一个版本HEAD^^,往上100个版本可以写成HEAD~100。
回退
- 回到上个版本
git reset --hard head^ - 回到具体某个
commit id对应的版本git reset --hard commit-id,只需指定前几位即可 - 如果无法直接找到commit id,可以尝试使用
git reflog,它会记录每一次的操作命令,其中就包含了id信息。
撤销修改
- 撤销工作区的修改
git checkout -- fileorgit checkout . - 撤销暂存区的修改
git reset HEAD file
分支管理
创建与合并分支
- 切换到分支
git checkout branch-name - 创建并切换到分支
git checkout -b branch-name,这里的-b表示创建分支,checkout表示切换到对应分支. 它相当于git branch branch-name创建分支git checkout branch-name切换分支
- 查看当前分支
git branch Fast Forward模式合并分支git merge target-branch-name. 此模式适用于目标分支有新提交,当前分支没有新提交即落后于目标分支,直接推进master指针即可删除分支
git branch -d branch-name. 如果目标分支上已经有了提交,但没有合并到当前分支上,此命令会失败,需要改为git branch -D branch-name
解决冲突
在执行git merge branch-name操作时,如果提示有冲突,就必须先解决完冲突才能再提交。这种情况下Fast Forward模式无法起作用,因为当前分支不是单纯的落后目标分支。
冲突前:
解决完冲突后
分支管理策略
不使用Fast Forward进行合并
Fast forward模式下合并时,看不到目标分支的各种提交信息,合并操作也没有当做一次commit操作, 删除分支后,会丢掉分支信息。
使用--no-ff来强制不使用FF模式合并,上述的缺点都会避免:
1 | git merge --no-ff -m "commit message" target-branch-name |
加上-m是为了将此次合并当做一次提交。
git stash与BUG分支
有时候当前分支的活没干完,临时需要去修BUG,但又不能直接把半成品提交,此时可以借助git stash将当前工作内容藏匿起来,但又不是放到暂存区。
stash之后,当前工作区就是干净的了,可以使用git status验证。然后就可以创建BUG分支,修改之后合并到当前分支。
git stash将当前分支的修改藏匿起来git stash list可以进行多次藏匿,使用此命令查看所有的藏匿列表从藏匿列表中恢复
- 先恢复再删除对应藏匿记录:
git stash apply从藏匿列表的最新一条记录恢复,但不删除此记录git stash drop删除藏匿列表的最新一条
- 恢复的同时并删除
git stash pop 恢复指定的一条藏匿记录,每条藏匿记录都有一个标识,使用
git stash list查看,然后使用例如1
git stash apply stash@{0} # stash@{0} 就是记录的标识
- 先恢复再删除对应藏匿记录:
多人写作
使用git remote 或 git remote -v获取远程仓库的信息
推送分支
- 将本地某个分支推送到远程的对应分支
git push origin branch-name,branch-name为本地的分支,一般是master或dev
抓取分支
- 使用
git clone remote-address克隆远程仓库到本地,此时会默认建立本地master到远程master的联系,可以使用git branch验证 - 创建一个本地分支并与远程仓库的对应分支联系:
git checkout -b branch-name origin/branch-name,之后在此分支上提交代码就可以使用git push origin branch-name了。 - 使用
git pull拉取远程仓库的最新提交,如果提示no tracking information,则表示当前本地分支还没有任何远程分支建立联系,使用git branch --set-upstream-to=origin/branch-name branch-name来建立联系
标签管理
git tag tag-name以当前分支的最新一次提交打标签,暂时还只在本地存储的git tag tag-name commit-id以指定的commit id对应的版本来打标签git tag显示所有标签git show tag-name显示标签的详细信息- 创建带有说明的标签:
git tag -a tag-name -m tag-desc [commit-id] git tag -d tag-name删除标签(本地的标签)- 推送标签到远程仓库
git push origin tag-name推送单个标签git push origin --tags推送所有标签
- 删除远程仓库标签
- 先从本地删除这个标签
git tag -d tag-name - 再将删除操作推送到远程
git push origin :refs/tags/tag-name
- 先从本地删除这个标签
设置命令别名
别名有3种级别: 用户级--global、系统级--system、项目级无需修饰符
- 设置级别名
git config [level] alias.alias-name "command-name",如:git config --global alias.ci "commit" - 获取所有别名
git config [level] --get-regexp alias