Git常用命令
一. 基本概念
工作区:存放代码的目录
暂存区:存放临时改动
git仓库:包含所有已经提交的数据
通常的工作流程为:
在工作区中添加修改文件(绿色是新添加,红色是已修改),目前状态为已修改(modified);
如果暂时不想提交的代码可以存进暂存区,被add的文件都会进入暂存区,暂存区内的文件是会被git追踪的。此时为已暂存(staged);
暂存区记录的是对文件的修改,只要是add过的文件,任何修改只要保存了都会添加进暂存区。
修改完成后提交代码之,代码进入仓库,此时状态为已提交(committed)
二. 常用操作
1. init
初始化仓库
git init
2. add
添加文件修改到暂存区
git add test.md
add 命令如果针对的是未追踪的文件,则把文件添加到暂存区。
如果针对的是已追踪的文件,则把文件的修改添加到暂存区。
3. commit
将暂存区中的修改提交到本地仓库
git commit -m "提交说明"
如果文件只是修改了,但没有通过add将修改同步到暂存区,那么就只会提交暂存区现有的修改。
git commit -am "同步修改到暂存区并提交到git仓库"
如果有些文件在工作区忘记add了,不用重新commit,可以直接修改上一次commit。
git commit --amend
如果是只修改commit描述
git commit --amend -m "追加的提交描述"
4. status
查看当前工作区内当前分支下,上次提交之后哪些文件有修改。
git status
5. reset
每次commit 都会在仓库创建一个快照,git reflog
可以查看快照ID。
reset命令会把仓库的修改还原到暂存区,HEAD是一个游标,指向的是仓库的最近一次提交。HEAD~ 表示HEAD的上一个快照,HEAD~~ 表示上上个快照,HEAD~8 表示HEAD的上8个快照。
如下命令回滚的范围从小到大:
git reset --soft HEAD~
只移动HEAD,并不会将快照回滚到暂存区,相当于撤销了上一次commit,因为上次提交会清空暂存区,现在游标移动仓库内最新的快照为上上次的提交。
git reset --mixed HEAD~
git reset HEAD~
git reset HEAD~
实际是 git reset --mixed HEAD~
默认模式就是mixed首先移动HEAD,指向上一个快照,然后将该位置的快照回滚到暂存区。
git reset --hard HEAD~
hard 模式会将快照回滚到暂存区,并将暂存区文件还原到工作目录。
reset 还可以回滚指定文件,可以回滚到HEAD之前或之后。
git reset 快照ID 文件名/目录
6. checkout
将暂存区中的修改,恢复到工作区中,会丢失工作区中未提交到暂存区的修改。如果是在工作区误删文件,可以通过该命令从暂存区恢复文件。
git checkout -- 文件名
7. diff
比较不同分支或文件的差异,比较对象有工作区,暂存区,仓库(HEAD、快照1、快照2…)。
工作区和快照对比
git diff ed32c92
git diff HEAD
工作区和暂存区对比
git diff
暂存区和仓库对比
git diff --cache ed23544
// 暂存区和HEAD对比
git diff --cache
7. branch
创建分支:在指定节点创建分支相当于创建了副本,可以进行不同的修改。
git branch secondbc
切换分支:执行以上命令可以创建secondbc分支,分支的节点位置是HEAD指向的节点。但此时HEAD指向的依旧是master分支,需要执行切换命令才会切换到新分支。
git checkout secondbc
注意:checkout 分支不会将暂存区的修改 和工作区的修改 覆盖掉,此时再commit 就会将这些修改提交到新分支。如果暂存区没有修改了,checkout 会直接被修改到新分支的状态(在旧分支branch之后提交的修改,切换新分支,工作区中会没有这些修改)。
创建并切换分支
git checkout -b thirdbc
8. merge
合并分支:通常需要在子分支完成新特性开发,之后合并到master分支。首先需要切换到master分支。
git merge secondbc
合并有冲突时需要先解决冲突再提交(本地可以在master上修改并提交),也可以选择取消这次合并。
git merge --abort
三. 特殊案例
(4)将暂存区中的修改,恢复到工作区中,会丢失工作区中未提交到暂存区的修改。
git checkout -- rest.md
(5) 查看当前工作区内当前分支下,上次提交之后哪些文件有修改。
git status