Git 常用命令
大览
- master 默认开发分支
- Origin 默认远程版本库
- Head 默认开发分支
- Head^ Head的父提交
创建版本库
- git clone
从远程仓库拷贝代码到本地 - git init 创建 Git 库
分支与标签
- git branch xxx_dev 创建名字为
xxx_dev
的分支 - git branch -d xxx_dev 删除
xxx_dev
的分支 - git branch 查看当前的分支名称
- git branch -r :查看远程分支
- git merge
将 branch 分支合并到当前分支 - git checkout xxx_dev 切换到名字为
xxx_dev
的分支 - git checkout 可以将 HEAD 移到一个新的分支,并更新工作目录。因为可能会覆盖本地的修改,所以执行这个指令之前,你需要 stash 或者 commit 暂存区和工作区的更改。
- git push origin xxx_dev 执行推送的操作,完成本地分支向远程分支的同步
- git tag 查看标签
- git tag xxx_dev 基于最新提交创建名字为
xxx_dev
标签 - git tag -d xxx_dev 删除
xxx_dev
的标签- 打标签 git tag -a v1.01 -m “Release version 1.01”
- 提交标签到远程仓库 :
git push origin --tags
- 查看某两次 tag 之间的 commit :
git log --pretty=oneline tagA..tagB
- 查看某次 tag 之后的 commit :
git log --pretty=oneline tagA..
- git checkout
切换到指定分支或标签;可以将 HEAD 移到一个新的分支,并更新工作目录。因为可能会覆盖本地的修改,所以执行这个指令之前,你需要 stash 或者 commit 暂存区和工作区的更改。
这两个命令都是把修改从一个分支集成到另一个分支上,它们只是以非常不同的方式进行
何时使用:
- 如果你对修改不够果断,请使用合并操作
- 根据你希望的历史记录的样子,而选择使用变基或合并操作
- git merge 把本地代码和已经取得的远程仓库代码合并
- git rebase ,是复位基底的意思。使用变基时,意味着使用另一个分支作为集成修改的新基础
Git 提交代码时候写错 commit 信息后,如何重新设置 commit 信息?
可以通过 git commit --amend
来对本次 commit 进行修改。
修改和提交
git status 查看当前仓库的状态
git diff 查看本次修改与上次修改的内容的区别
git show 显示某次提交的内容 git show $id
git add
把现在所要添加的文件放到暂存区中 git rm
从版本库中删除文件 git reset
从暂存区恢复到工作文件 git reset HEAD^ 恢复最近一次提交过的状态,即放弃上次提交后的所有本次修改
git commit 把 git add 到暂存区的内容提交到代码区中
git stash 暂存
git stash pop 恢复最近一次的暂存
git reset HEAD^ —hard 刚才的Commit后悔了,想要拆掉重做)
远程操作
- git pull 抓取远程仓库所有分支更新并合并到本地
git push origin master
:将本地主分支推到远程主分支- 使用
git fetch
是取回远端更新,不会对本地执行 merge 操作,不会去动你的本地的内容。而git pull
会更新你本地代码到服务器上对应分支的最新版本 - git remote -v 查看远程版本库信息
- git remote show
查看指定远程版本库信息 - git remote add
添加远程版本库
来自于 芋道源码
🦅 reset 与 rebase 有什么区别?
- reset 操作,不修改 commit 相关的东西,只会去修改
.git
目录下的东西。 - rebase 操作,会试图修改你已经 commit 的东西,比如覆盖 commit 的历史等,但是不能使用 rebase 来修改已经 push 过的内容,容易出现兼容性问题。rebase 还可以来解决内容的冲突,解决两个人修改了同一份内容,然后失败的问题。
推荐看看 《“git reset”和“git rebase”有什么区别?》 。
🦅 reset 与 revert 与 checkout 有什么区别?
首先是它们的共同点:用来撤销代码仓库中的某些更改。
然后是不同点:
1)从 commit 层面来说:
git reset
,可以将一个分支的末端指向之前的一个 commit 。然后再下次 Git 执行垃圾回收的时候,会把这个 commit 之后的 commit 都扔掉。git reset
还支持三种标记,用来标记 reset 指令影响的范围:--mixed
:会影响到暂存区和历史记录区。也是默认选项;--soft
:只影响历史记录区;--hard
:影响工作区、暂存区和历史记录区。注意:因为
git reset
是直接删除 commit 记录,从而会影响到其他开发人员的分支,所以不要在公共分支(比如 develop)做这个操作。
git checkout
,可以将 HEAD 移到一个新的分支,并更新工作目录。因为可能会覆盖本地的修改,所以执行这个指令之前,你需要 stash 或者 commit 暂存区和工作区的更改。git revert
,和git reset
的目的是一样的,但是做法不同,它会以创建新的 commit 的方式来撤销 commit ,这样能保留之前的 commit 历史,比较安全。另外,同样因为可能会覆盖本地的修改,所以执行这个指令之前,你需要 stash 或者 commit 暂存区和工作区的更改。
2)从文件层面来说
git reset
,只是把文件从历史记录区拿到暂存区,不影响工作区的内容。而且支持--mixed
、--soft
和--hard
。git checkout
,则是把文件从历史记录拿到工作区,不影响暂存区的内容。git revert
,不支持文件层面的操作。
总的来说,回答关键点:
- 对于 commit 层面和文件层面,这三个指令本身功能差别很大。
git revert
不支持文件层面的操作。- 不要在公共分支做
git reset
操作。
🦅 不小心用 git reset –hard 指令把提交理掉了,有机会救回來吗?
放心,基本上东西进了 Git 就不容易消失,它們只是以一种我们肉眼看不懂的格式存放在 Git 空间裡。我们可以透過 git reflog
指令去翻一下被 reset 的那個 Commit 的编号值,然後再做一次 git reset --hard
就可以把它救回來了。