文章目录
- Git的基本结构
- 初始化仓库:git init
- 查看状态:git status
- 添加进暂存区:git add
- 添加进本地库:git commit
- 删除文件:git rm
- 查看操作记录:git log
- 版本回退:git reset
- 撤销commit:git revert
- 查看所有历史记录:git reflog
- 文件暂存和恢复:git stash
- 补丁合并:git cherry-pick
- 创建和切换分支:git branch 、git checkout
- 合并:git merge
- 建立仓库联系 git remote
- 抓取分支:git fetch
- 克隆仓库:git clone
- 拉取仓库分支:git pull
- 推送仓库分支:git push
- 合并多次提交、合并分支:git rebase
Git的基本结构
初始化仓库:git init
git init
:在当前目录创建git仓库
git init dir/a
:在当前目录下dir文件夹的a文件夹下创建仓库,相当于git 帮忙执行了mkdir -p dir/a
查看状态:git status
git status 会显示当前目录的文件状态,一般有以下几种状态:
- Untracked:未被追踪,新建的文件
- Staged:在文件暂存区中,但是没有被提交,commit后将进入库中
- Unmodify:处于本地库中,与工作目录中的文件完全一致
- Modified:文件被修改,可以再次add,进入Staged状态(放到文件暂存区)
添加进暂存区:git add
新建文件,文件将处于未追踪(Untracked
)状态。另外修改、删除文件后也需要git add操作,将这个操作记录到暂存区,然后再commit。(有些参数和命令可以隐式add)
git add file1 file2
:将file1、file2添加进暂存区;git add .
:将当前目录所有文件添加进暂存区;
添加进本地库:git commit
git commit
:将暂存区的所有文件添加进本地库git commit file1 file2
:有选择性的添加git commit -a
:如果对文件进行了修改或者删除,正常需要再add一次,添加-a ,则可以一次性提交。只对修改和删除的文件有效,如果是新建且没有add过的文件,仍旧需要add一次
如果不添加参数,输入git commit
后,git的命令端会进入一个界面,需要手动输入本次提交的备注
git commit -m "备注"
:添加-m参数,不进入界面,直接添加备注git commit --amend
:对本次提交备注进行修改*(只能是最近一次的提交)*,该命令会进入文件内进行修改,wq
保存退出即可。
删除文件:git rm
前面说了删除某个文件(使用rm删除的话),需要add再commit才行。
- 即:
rm a.txt
->git add a.txt
->git commit -m "delete a.txt"
使用git rm
则不用再add一次了,直接commit即可。这个命令相当于隐式使用了git add。
- 即:
git rm a.txt
->git commit -m "delete a.txt"
也可以commit的-a参数: rm a.txt
->git commit -am "delete a.txt
查看操作记录:git log
git log
可以查看之前的所有操作记录。需要关注红框里面的版本号。
版本回退:git reset
git reset 版本号
:可以将当前代码回退到某次commit的版本。回退是一件危险程度较高的操作。git通过在git reset后面指定参数来指定回退的模式。
- soft:移动指针,但工作区和暂存区都不发生变化
- mixed:移动指针,但工作区不发生变化、暂存区会被清空,使用reset不带参数时,即为此模式
- hard:移动指针,工作区和暂存区都会清空,如果存在未被commit的文件,则会丢失,是危险操作。使用此模式时可以先使用
git stash
保存一下。 - keep:keep和merge属于hard的折中模式,对于新增的文件,回退的版本会删除,但是如果存在当前版本和回退版本都有的文件被修改的情况,那么该模式就无法使用。
- merge:和keep差不多,唯一的区别是,存在当前版本和回退版本都有的文件被修改的情况,并且该文件修改之后被add进了暂存区,那么就可以reset
撤销commit:git revert
git revert <commitId>
如果想撤销某次commit,可以使用git revert
。
不过并不是真的直接撤销某次提交,而是把某次提交的记录撤回,整理成一个新的提交。
使用后,会在仓库里面多一条commit记录(该记录就是撤销的内容)。
查看所有历史记录:git reflog
- 前面提到
git log
可以查看历史记录,但是只能查看Head指针以前的记录。比如进行git reset
操作,Head指针发生了改变。那么就只能看见reset的版本之前的commit记录。 - 使用
git reflog
则可以看见所有的操作记录。
文件暂存和恢复:git stash
需要进行一些敏感操作时,比如分支合并,远程拉取,版本回退时,可以使用git stash
将当前版本的操作记录暂存到堆栈。 所有修改、删除、文件新增等操作都会回退到Head版本。
-
如果文件只是新增却还没有
git add
,那git stash不会对它有用,因为该文件还没有被git追踪到) -
gist stash list
:查看堆栈中所有stash列表 -
git stash pop
:将最新的stash内容应用到当前版本,并且移除该stash,默认为最近stash -
git stash apply
: 将最新的stash内容应用到当前版本,不移除该stash,默认为最近stash
补丁合并:git cherry-pick
git cherry-pick <commit version>
:可以选择某个分支的一条或者多条 commit 记录,应用到当前分支,如果出现冲突需要手动解决
创建和切换分支:git branch 、git checkout
git branch
:查看当前所属分支git branch xx
:新建xx分支git branch -a
:查看所有分支,包括远程分支git branch -d <BranchName>
:删除分支git checkout xx
:切换到xx分支git checkout -b xx
:新建并切换到xx分支
合并:git merge
get merge <branch>
:将给定分支合并到当前分支
如果出现冲突,可以git merge --abort
还原。
建立仓库联系 git remote
git remote add origin <url>
:将远程地址与本地建立联系,供git fetch、git pull、git push
等命令使用
抓取分支:git fetch
git fetch origin <branch>
:抓取远程分支的最新版本(更新对应分支的commint Id)
- 抓取之后可以使用
git merge
进行远程和本地的分支合并 - 使用
git fetch origin
后会更新远程仓库的commit id到本地,并且也能查看到远程新增的分支。
比如使用git branch -r
可以查看远程的分支,但是需要先fetch更新一下内容,不然是查看不到最新的内容的。
克隆仓库:git clone
git clone <url>
:将远程仓库整个复制到本地
拉取仓库分支:git pull
git pull origin <branch>
:拉取远程分支到本地并进行合并,如果有冲突,需要手动解决。
git pull
=git fetch
+get merge
git pull -r
=git fetch
+get rebase
推送仓库分支:git push
git push --set-upstream origin <branch>
:首次推送分支时,需要使用–set-upstream指定当前分支对应的上游分支,后面就可以使用git push
不带参数git push origin --delete <branch>
:删除远程仓库上面的分支git push -f origin <branch>
:强制推送到远程分支,一般是在本地分支记录落后于远程分支时使用,比如使用了reset操作,在多人合作时谨慎使用,因为可能导致他人提交记录被删掉。
合并多次提交、合并分支:git rebase
git rebase
可以将其它分支合并到当前分支,不同于git merge
。
git merge
会比对两个分支以及共同的祖先版本,最终合并后新增一个commit 记录git rebase
则相当于是把待合并的分支与当前分支共同祖先之后的commit 打成一个接一个的patch(修改记录),最后更新到当前分支,期间可能会出现冲突,需要手动解决。并且最后不会生成额外记录。
另外git rebase
不仅可以合并分支,还可以合并或修改当前分支的commit记录。
git rebase -i HEAD~2
:处理当前HEAD与它前面的commit 记录(可以修改和合并)
利用这个命令,可以做到修改较早版本的commit注释。也可以合并分支的多条记录。
出现冲突时,也可以使用git rebase --abort
停止,或者解决后使用git rebase --continue
继续。