文章目录
指令
基本指令
仓库初始化
git init
添加文件
git add <文件名>
git commit -m '评论的内容'`
git push origin master 提交到远程仓库
删除文件
git rm -r --cached 文件名/文件夹名
git commit -m '说明'
git push origin master 将操作提交到远程仓库
拉取远程仓库到本地
git clone gitlab@project_name.git
查看当前文件变化
git status
git diff
查看提交历史
git log
git add
git commit
只commit修改的文件及新增文件
git add --all
git commit -m "Pushing all files to git"
git push
git reset
commit之后,想保留修改,取消commit
git reset --soft HEAD^ // 回退到上一个节点,保留工作区的内容
git reset --hard HEAD^ // 回退到上一个节点,删除工作区的内容
git reset --soft HEAD~1 // 回退到上一个节点
git reset --hard HEAD~2 // 回退到上两个节点,并删除工作空间所有修改
reset head就是将当前的head回退到上一个节点
--soft
会保留当前工作空间的修改,相当于单纯的取消commit
--hard
会连工作空间的修改一起删除掉
git checkout/branch
该指令用来创建和切换分支
git checkout -b my-branch origin-branch // 复制origin-branch并创建新分支my-branch
git checkout -b name/task/spot-number/description // 创建分支并进入到该分支
git checkout username/task/spot-number/description // 切换到该分支
git checkout master // 进入到master分支
git branch // 查看当前分支
git merge
git merge branchA branchB // 将branchA合并进branchB
git merge branch_name // 将branch_name merge到当前的分支
git reset --merge // 取消merge
不加第二个参数origin-master`时默认是当前分支。
合并参数:
参数 | 含义 |
---|---|
ff | fast-forward,默认使用该参数。 如果我们是合并到自己的直接上游分支,不会产生merge log; 如果上游分支已经有其他的commit了,则会进行一次三方合并(magic),并生成merge log; 如果三方合并失败,就需要解决冲突并commit后再merge |
-no-ff | no fast-forward 默认是第三方合并,一定会生成merge log |
-ff-only | 只接受 fast-forward |
git pull, merge & rebase
git pull = git fetch + git merge
git pull --rebase = git fetch + git rebase origin/master
git pull
实现的效果如下图所示,黑色为master主线,橙色为本地支线。该指令将master主线的commit5 pull至本地,形成了菱形的效果。
git pull --rebase
则取消了之前的所有commit,把这些所有的改动临时保存为补丁(patch)(这些补丁放到”.git/rebase“目录中),然后把当前分支更新到最新的master分支,最后把保存的补丁应用到当前分支上。
使用rebase时,需要切换到当前的支线,然后再rebase主分支。
git checkout my-branch
git rebase origin-branch
如下图所示:
在执行git pull -rebase
指令时,如果出现文件冲突,先处理冲突的文件,然后用git add
更新内容,最后继续执行git rebase --continue
。如果想回退,可以执行git rebase --abort
。
git log/relog
git relog
查看所有分支的所有commit记录(包括已经被删除的 commit 记录和 reset 的操作)
git log
查看历史commit(不能查看已经删除的commit记录
git diff
比较两个分支的区别
git diff branch1 branch2 // 比较两个分支的区别
git diff branch1 branch2 /path/to/file // 比较两个分支指定文件的区别
比较工作区和最新commit之间的差异
git diff HEAD
git tag
git可以标记重要的提交节点
// 列出历史标记节点
git tag
// 列出匹配当前字段的节点
git tag -l "v1.8.5*"
git branch
git branch // 展示当前所有的分支
git branch new_branch // 复制当前分支并重命名为new_branch
git branch -d branch_name // 删除本地分支(该分支已经merge到远程)
git branch -D branch_name // 删除本地分支(该分支只存在于本地, 还未merge到远程)
常见使用场景
本地分支写完后push到远程分支
首先是常规的创建分支:
git checkout -b name/task/spot-number/description // 创建分支并进入到该分支
然后git add
和git commit
,然后
git push origin xianming/task/spot-number/description-of-this-feature
从master分支修改准备merge到test环境时,发现别人在test分支上已经有了其他修改
我们一般是clone repo的master分支来修改代码,改完之后先push到test环境。但如果此时test环境已经有其他人merge的代码,我们再merge的话就会覆盖其他人的代码。
这种情况下我们可以先将远程的test分支拉到本地,将自己写的分支merge到本地的test分支,然后再将这个test分支push到远程(origin/test)去。
1. 首先拉取远程的test分支到本地的test分支
git checkout -b test origin/test
如果本地已经有test分支,可以先checkout到test分支,再将远程的test分支更新到本地的test分支:
git checkout test
git pull origin test:test
然后将本地的branch merge到本地的test分支:
git checkout test
git merge xianming/task/spot-number/description-of-this-feature
最后将本地merge好的test分支push到远程test分支,并在gitlab页面对冲突进行修改:
git checkout test
git push origin test
在本地分支开发时,远程master发生修改,需要merge到本地分支
首先本地切换到master分支,将远程master分支pull到本地
git checkout master
git pull origin master
然后切换到本地自己的分支,并merge本地更新好的master分支,到本地自己正在开发的分支
git checkout xianming/task/spot-number/description-of-this-feature
git merge master
执行git merge master
之后原则上我们的文件已经merge完了,但是命令行出现merge冲突提示,可以使用:
git mergetool
对冲突文件进行修改
本地和远程都需要回退到上一个节点
本地回退到上一个节点:
git reset --soft HEAD^ // 回退到上一个节点,保留工作区的内容
git reset --hard HEAD^ // 回退到上一个节点,删除工作区的内容
git reset --soft HEAD~1 // 回退到上一个节点
git reset --hard HEAD~2 // 回退到上两个节点,并删除工作空间所有修改
远程回退到上一个节点:
方法一:本地回退后直接强制push到远程(这种方式可以避免mr失效)
git push origin branch_name -f
方法二:先将本地分支退回到某个commit,删除远程分支,再重新push本地分支(mr会失效)
git checkout the_branch
git pull // 更新该分支到本地
git branch the_branch_backup // 将这个分支copy到the_branch_backup
git reset --hard HEAD^ // 回退到上一个节点,删除工作区的内容
git push origin :the_branch // 删除远程的该分支
git push origin the_branch // 将回退的本地分支重新push到远程
git push origin :the_branch_backup //如果前面都成功了,删除这个备份分支
这种方式会mr失效,需要重新申请一次mr
检查文件变化
检查哪些文件变动过
git status
清除当前工作区没有add的修改
git checkout .
删除本地分支/远程分支
假设要删除的本地分支为my_branch.
首先要切换到其他的分支, 然后执行删除:
git checkout master
git branch -d branch_to_delete
删除远程分支:
git push origin --delete my_branch
删除当前工作区的所有改动
git reset --hard HEAD : 将stage area中未提交的file回滚到之前的commit状态
git clean -d -f 删除未跟踪的目录和文件
trouble shooting
git checkout: you need to resolve your current index first
我们在执行git checkout的时候可能会遇到这个问题。这个问题原因是当前的分支下有merge conflict
解决方法1: 解决这个merge conflict
例如冲突的文件是在file.txt这个文件,我们对该文件进行对应的增删后,执行一下语句
git add file.txt
git commit
解决方法2:取消当前分支的merge request
git reset --merge
使用git merge时显示Automatic merge failed,无法自动合并
这种情况是想要合并时,两个分支都对同一个文件进行了修改,git无法识别到底采用哪个分支的代码,因此自动合并失败。这种情况下,可以使用:
git mergetool
决定要使用冲突文件中的哪部分代码。其中
其他
一些概念
git config
git config文件:
git config文件有三个:
- /etc/gitconfig:包含了适用于系统所有用户和所有项目的值。
- ~/.gitconfig:只适用于当前登录用户的配置。
- 位于git项目目录中的.git/config:适用于特定git项目的配置。
对于同一配置项,三个配置文件的优先级是1<2<3
git 用户名和email:
$ git config user.name "ximi"
$ git config user.email "ximi@gmail.com"