Git版本控制
## 工作区和暂存区
在一个目录下我们,我们使用命令
1 | git init |
则会在此目录下创建一个.git
的隐藏文件夹,这就是Git的版本库 ,而当前目录就是我们的工作区 ,Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区 ,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
工作区、暂存区和版本库的关系:
注:Git不是保存多版本的文件,而是保存文件的修改
Git常见操作
1.添加到暂存区:
1 | git add filename |
2.提交到版本库:
1 | git commit -m “commit description” |
3.查看状态:
1 | git status |
4.查看提交日志
详细日志
1 | git log |
只显示一行的日志(主要查看commit id)
1 | git log --pretty=oneline |
5.版本回滚
1 | git reset --hard commitID |
commitID可以通过git log --pretty=oneline
或者git reflog
查找出来
6.操作日志
1 | git reflog |
因为使用git reset --hard commitID
版本回滚后,git log
和 git log --pretty=oneline
就找不到回滚后版本之后的commitID,想要再次回到原来的最新版本,就需要通过git reflog
这个命令查询到所有的版本的commitID和操作,再次执行版本回滚命令就好了
7.撤销修改
1 | git checkout -- filename |
- 情况一:如果没有提交到暂存区或者版本库,执行
git checkout -- filename
可以让本地修改撤销(注意--
和filename
之间有空格) - 情况二:如果已经提交到了暂存区,则执行
git reset HEAD filename
(注意这个命令跟版本回滚命令缺少了–hard)可以把丢弃暂存区的修改,再执行情况一的命令就可以完全撤销修改了 - 情况三:如果已经提交到版本库了,那么只能版本回滚了,前提是没有提交到远程仓库
8.删除文件
1 | git rm filename |
执行后还要执行git commit
提交删除操作到版本库
远程仓库
1.关联远程仓库
1 | git remote add origin https://github.com/chenlf/cangku.git |
2.本地仓库内容推送到远程仓库
1 | git push -u origin main |
注意第一次推送时会要求你输入用户名和密码。由于远程库是空的,我们第一次推送main分支时,加上了-u
参数,Git不但会把本地的main分支内容推送的远程新的main分支,还会把本地的main分支和远程的main分支关联起来,在以后的推送或者拉取时就可以简化命令。之后就不需要加上-u
.(这里是推送到main分支)
3.克隆远程仓库
1 | git clone https://github.com/chenlf/cangku.git |
4.拉取代码
1 | git pull |
git pull
其实是分了两步,一是拉取代码到本地,和git fetch命令效果一致。二是将拉取下来的代码与本地仓库的当前分支的代码进行合并。git pull
就是已经有连接的拉取,git pull origin dev:dev
是将远程仓库的dev分支拉取到本地的dev分支。如果只想用git pull
拉取就需要将远程仓库的dev和本地仓库的dev连接:
1 | git branch --set-upstream-to=origin/dev dev |
5.查看远程仓库
1 | git remote -v |
6.拉取远程仓库的其他分支
1 | git checkout -b dev origin/dev |
7.创建远程分支(要先创建好本地分支)
1 | git push --set-upstream origin dev-xx |
分支管理
新建分支
1 | git branch dev |
切换分支
1 | git checkout dev |
创建并切换分支
1 | git checkout -b dev |
查看分支
1 | git branch |
快速合并分支
1 | git merge dev |
删除分支
1 | git branch -d dev |
合并分支有冲突
当两个分支有同一文件有不同内容时,合并会产生冲突,这是文件会Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们需要手动修改后保存(把冲突的内容手动解决,移除<<<<<<<,=======,>>>>>>>等标记)
1 | Git tracks changes of files. |
手动修改
1 | Git tracks changes of files. |
再提交
1 | $ git add readme.txt |
现在,master分支和feature1分支变成了下图所示(在master分支上合并feature1分支):
用带参数的git log也可以看到分支的合并情况:
1 | $ git log --graph --pretty=oneline --abbrev-commit |
stash工作现场“储藏”
主要为了解决在dev分支开发到一半,但是有一个紧急BUG需要解决,此时不好提交dev的内容。
保存现场:
1 | git stash |
查看现场存储
1 | git stash list |
恢复现场:
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了:
1 | git stash pop |
分支管理策略
通常,合并分支时,如果可能,Git会用Fast forward快速合并模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
禁用Fast forward模式合并:
1 | git merge --no-ff -m "merge with no-ff" dev |
此时可以在历史中看到分支历史和commit描述
1 | git log --graph --pretty=oneline --abbrev-commit |
如果是快速合并:
1 | git log --graph --pretty=oneline --abbrev-commit |