使用git已经有一年的时间了,但之前对于git只学习了基础操作,没有学习分支相关的内容,最近有项目需要多人协同开发,会用到合并分支和解决冲突,于是我重新学习了git的相关知识,算是对git有一个更好的掌握吧。
一、基本配置
1.配置用户名和邮箱,配置文件在用户目录中,叫做.gitconfig
git config --global user.name “anonyeast”
git config --global user.email “east@anonyeast.top"
2. 解决GitBash乱码问题
git config --global core.quotepath false
并在${git_home}/etc/bash.bashrc 文件最后加入下面两行
export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"
3.配置常用指令的别名,用于简化命令
(1)在用户目录下创建 .bashrc 文件。
(2)写入如下内容
#用于输出git提交日志 alias git-log='git log --pretty=oneline --all --graph --abbrev-commit' #用于输出当前目录所有文件及基本信息 alias ll='ls -al'
二、本地操作
1.初始化当前目录为一个git仓库,完成之后会在当前目录创建一个叫做.git的文件夹,默认是隐藏的。
git init
2.提交到本地仓库
git add
(工作区 --> 暂存区)
git commit -m '注释'
(暂存区 --> 本地仓库)
3.查看状态
(1)查看修改的状态(暂存区、工作区),可以查看当前工作区哪些文件有变化,下次add时,这些文件会被添加到暂存区。
git status
(2)查看提交日志,这个命令很重要,可以很清晰的看到每一次的提交记录和注释,以及提前到哪个分支(分支在后面会写)
命令形式:git log [option]
其中option可选择以下参数
--all 显示所有分支
--pretty=oneline 将提交信息显示为一行
--abbrev-commit 使得输出的commitId更简短
--graph 以图的形式显示
实际操作中使用上面在.bashrc文件中配置好的git-log
命令即可,这个命令已经包含了以上4个参数,不用我们手敲。
4.版本回退,当提交之后发现提交的内容有问题需要撤销时,需要进行版本回退
git reset --hard commitID
其中commitID 可以使用 git-log 或 git log 指令查看,如下图所示
如果版本回退后,又想撤销回退操作,回到回退之前的版本,则可以通过以下命令查看操作记录,找到commitid,依然使用上面的命令回到回退之前的状态。
git reflog
5.添加文件至忽略列表
在工作目录中创建一个.gitignore的文件,在该文件中写不被add的文件。具体写法百度,这里就不赘述了。
三、分支
在gitbash中,每次只能操作一个分支,不能同时对多个分支进行操作,默认分支为master分支。
可以通过git-log指令查看当前分支,HEAD指向的分支就是项目当前所在的分支。
1.查看本地分支
git branch
2.创建本地分支
git branch 分支名
3.切换分支(重要)
git checkout 分支名
直接切换到一个不存在的分支(创建并切换)
git checkout -b 分支名
4.合并分支(重要)
将指定分支上的提交(commit)合并到当前分支,当前分支可以通过git-log查看HEAD指向,务必在合并分支前确认当前分支
git merge 分支名称
5.删除分支
有些分支合并到另一个分支后就可以删除了,也可能你误操作创建了一个不需要的分支。
git branch -d 分支名
删除分支时,需要做各种检查。当被删除的分支存在改动,却没有与任何分支合并时,这时候删除的话,这个分支的改动就会彻底丢失,git会认为你是在误操作,需要你进行确认,确认要删除的话使用下面的命令。
git branch -D 分支名
不做任何检查,强制删除
6.解决冲突
当一个分支合并到另一个分支时,如果出现了两个分支修改了同一个文件的同一行代码,就会发生冲突。
解决步骤:
1. 处理合并后的文件中冲突的地方
2. 将解决完冲突的文件加入暂存区(add)
3. 提交到仓库(commit)
四、远程仓库
请先在gitee/github/gitlab创建仓库,如果本地已经创建有本地仓库,建议远程仓库在创建时不要选择任何初始化选项,例如自动生成readme.md文件、设置开源协议等,否则一定会产生冲突问题。
1.添加远程仓库地址
git remote add <远端名称> <仓库路径>
远端名称:默认是origin,取决于远端服务器设置
仓库路径:从远程仓库获取此URL
例如: git remote add origin git@gitee.com:AnonyEast/git-learning.git
2.查看远程仓库
git remote
3.推送已经commit的内容到远程仓库
git push [-f] [--set-upstream] [远端名称 [本地分支名][:远端分支名] ]
(1)如果远程分支名和本地分支名称相同,则可以只写本地分支名,即:git push origin master
(2)-f 表示强制覆盖,当远程仓库与本地仓库修改了同一个文件的同一个内容,此时发生冲突,加上此参数可以强制覆盖。
(3)--set-upstream 推送到远端的同时并且建立起和远端分支的关联关系。
git push --set-upstream origin master
如果当前分支已经和远端分支关联,则可以省略分支名和远端名。
git push 将master分支推送到已关联的远端分支。
4. 查看本地分支与远程分支的关联关系
git branch -vv
5.从远程仓库克隆(clone)
git clone <仓库路径> [本地目录]
本地目录可以省略,会自动生成一个目录
6.从远程仓库中抓取(fetch)和拉取(pull)
远程分支和本地的分支一样可以进行merge操作,只是需要先把远端仓库里的更新都下载到本地,再进行操作。
- 1.抓取:
git fetch [远程仓库名] [分支名]
- 将远程仓库里的更新都抓取到本地,不会进行合并。
- 如果不指定远端名称和分支名,则抓取所有分支。
- 2.拉取:
git pull [远程仓库名] [分支名]
- 将远程仓库的修改拉到本地并自动进行合并,等同于fetch+merge。
- 如果不指定远端名称和分支名,则抓取所有并更新当前分支。
7.解决合并冲突
在一段时间内,A、B用户修改了同一个文件,且修改了同一行位置的代码,此时会发生合并冲突。
A用户在本地修改代码后优先推送到远程仓库,此时B用户在本地修改完代码,提交到本地仓库后,也需要推送到远程仓库,此时B用户晚于A用户,需要先拉取远程仓库的提交,经过合并后才能推送到远端分支。
在B用户拉取代码时,因为A、B用户同一段时间修改了同一个文件的相同位置代码,故会发生合并冲突。
远程分支也是分支,所以合并时冲突的解决方式也和解决本地分支冲突相同相同,在此不再赘述。