文章目录
- 一、简介
- 二、常用命令
- 三、具体命令常见用法
- git add保存修改
- branch的增删改查:
- git reset回退版本或代码
- git revert反转提交,撤销某个提交
- git merge合并分支
- git rebase远程仓库和本地代码冲突解决
- git reflog查看所有记录版本
- git stash暂存代码
- patch的生成
- git push推送代码
- git pull同步更新远程仓库代码及冲突处理
- git show查看更改代码内容
- git check-ignore查看被忽略文件
- git config新增配置
- git remote远程仓库操作
- git cherry-pick合并其他分支某个commit
- git rebase删除/修改/合并commit
- 修改某个commit的log
- git restore回退单个文件
- git add后回退成非add状态
- 在远程仓库中新增key之后git pull还要输入账号密码
- git blame指定文件的内容,并在每一行注释上显示具体修改信息
- .gitignore不生效
- git tag打标签用于版本发布
- git clean 命令用于从工作目录中删除未被 Git 跟踪的文件或文件夹
- git submodule update --init 和 --remote的区别
- 四、其他知识链接
一、简介
本文主要对git的常见参数进行讲解,并通过实例讲述git常见命令的使用。
Git是一个分布式的版本控制系统,与集中式的版本控制系统不同的是,每个人都工作在通过克隆建立的本地版本库中。也就是说每个人都拥有一个完整的版本库,查看提交日志、提交、创建里程碑和分支、合并分支、回退等所有操作都直接在本地完成而不需要网络连接。
首先要了解git的三个分区,分别是工作区、暂存区和版本库
二、常用命令
下面是git的常用命令,也是从下载源码、修改代码然后上传的一个过程;
1、git clone:从远程主机克隆一个版本库;
2、git remote:增加远程仓库地址;
[root@localhost /]# git remote add git://github.com/octocat/Spoon-Knife.git
3、git config:配置邮箱名和作者名;
[root@localhost /]# git config --global user.email "xxx@163.com"
[root@localhost /]# git config --global user.name "xxx"
4、git init:初始化本地git仓库状态;
5、git add:是将当前更改或者新增的文件加入到Git的索引中,加入到Git的索引中就表示记入了版本历史中,这也是提交之前所需要执行的一步;
6、git branch:对分支的增、删、查等操作;
7、git checkout:Git的checkout有两个作用,其一是在不同的branch之间进行切换,另一个功能是还原代码的作用;
8、git commit:提交当前工作空间的修改内容;
[root@localhost /]# git commit -m "first commit"
9、git diff:对比不同的commit或者分支的差异;
10、git reset:回滚到指定状态;
[root@localhost /]# git reset —hard HEAD^ //回滚到上一次记录
11、git merge:合并分支
[root@localhost /]# git merge master //合并当前分支到master分支
12、git rm:从当前的工作空间中和索引中删除文件;
13、git log:查看历史日志;
14、git status:查看本地代码情况
15、git revert:还原一个版本的修改,必须提供一个具体的Git版本号;
16、git push:将本地commit的代码更新到远程版本库中;
17、git pull:从其他的版本库(既可以是远程的也可以是本地的)将代码更新到本地;
[root@localhost /]# git pull -r origin patch //同步远程代码到本地并以rebase方式合并本地分支,git pull 就是 git fetch + git merge o/master
18、生成公钥的方法:
创建登录密钥和公钥
使用ssh-keygen -t rsa 建立密钥和公钥,即id_rsa 和 id_rsa.pub。然后将id_rsa.pub发送给服务器管理者,将其加入到授权列表中。
$ ssh-keygen -t rsa -C "ming.xing@xxx.com.cn"
三、具体命令常见用法
git add保存修改
删除文件后需要 git add -A, 使用git add .不行,区别如下:
[root@localhost /]# git add -A 保存所有的修改
[root@localhost /]# git add . 保存新的添加和修改,但是不包括删除
[root@localhost /]# git add -u 保存修改和删除,但是不包括新建文件。
所以默认使用git add -A就行
注意使用git add -A后,commit没有新增该文件,则需要排查该文件是否被忽略掉可用如下命令:
[root@localhost /]# git status --ignored
//忽略的文件都记录在.gitignore中
可用通过如下命令强制加入:
[root@localhost /]# git add mytest_file -f
branch的增删改查:
git branch就会列出本地所有的分支
git checkout切换分支
[root@localhost /]#git checkout -b newBranchName
这相当于执行下面这两条命令:
[root@localhost /]#git branch newBranchName
[root@localhost /]#git checkout newBranchName(工作区一定要是clean的)
[root@localhost /]#git checkout -b newBranchName remote_branch_name:拉取远程分支remote_branch_name创建一个本地分支newBranchName,并切到本地分支newBranchName,采用此种方法建立的本地分支会和远程分支建立映射关系。
特性分支名称以feature/作为前缀,feature后可以接大模块名进行细分,比如要进行nvme ramdisk的开发:
//为nvme ramdisk的开发创建特性分支
[root@localhost /]#git checkout -b feature/nvme/ramdisk
[root@localhost /]#git branch -D new_branch就会强制删除叫做new_branch的分支,
还原代码的作用:git checkout app/model/user.rb就会将user.rb文件从上一个已提交的版本中更新回来,未提交的内容全部会回滚
[root@localhost /]# git branch -m patch test_patch //重命名分支为test_patch
//删除远程分支
[root@localhost /]#git push origin --delete new_branch
//使用checkout命令新建一个空白分支
git checkout --orphan newBranchName
git reset回退版本或代码
git reset根据–soft –mixed –hard,会对working tree和index和HEAD进行重置
soft 参数:
git reset --soft HEAD~1 意为将版本库软回退1个版本,所谓软回退表示将本地版本库的头指针全部重置到指定版本,且将这次提交之后的所有变更都移动到暂存区
默认的mixed参数:
git reset HEAD~1 意为将版本库回退1个版本,将本地版本库的头指针全部重置到指定版本,且会重置暂存区,即这次提交之后的所有变更都移动到工作区
hard参数:
git reset --hard HEAD~1 意为将版本库回退1个版本,但是不仅仅是将本地版本库的头指针全部重置到指定版本,也会重置暂存区,并且会将工作区代码清空(工作区是clean状态)
注意,soft参数与默认参数都不会修改工作区代码,只有hard参数才会修改工作区代码。*/
git reset HEAD^
//回退版本,一个^表示一个版本,可以多个,另外也可以使用 git reset HEAD~n这种形式。
//也可以回退到指定版本:
git reset commit-id
git reset HEAD filename
//回退文件,将文件从暂存区回退到工作区(unstage),此时不能带hard,soft参数
git restore filename
//将暂存区的文件忽略更改
git revert反转提交,撤销某个提交
//主要用于撤销某个已提交的commit
git revert,反转提交, 撤销一个提交的同时会创建一个新的提交,也就是用一个新提交来消除一个历史提交所做的任何修改.
git revert commit-id revert指定的一个commit
git revert HEAD~3 revert指定倒数第四个commit
revert过程有可能遇到冲突,要么git revert --abort终止此次revert操作,代码还原至revert命令前。要么手动消除冲突(同普通的冲突解决),然后add commit
git merge合并分支
将 origin 分支合并到mytest分支最简单的办法就是用下面这些命令
git checkout mytest
git merge origin
或者,你也可以把它们压缩在一行里:
git merge origin mytest
git merge --no-ff develop
//使用--no-ff参数后,会执行正常合并,在Master分支上生成一个新节点。为了保证版本演进的清晰,我们希望采用这种做法。
git rebase远程仓库和本地代码冲突解决
作为 merge 的替代选择,你可以像下面这样将test1分支并入origin分支:
git checkout test1
git rebase origin
它会把整个test1分支移动到origin分支的后面,有效地把所有master分支上新的提交并入过来。但是,rebase为原分支上每一个提交创建一个新的提交,重写了项目历史,并且不会带来合并提交。rebase的好处是避免了菱形的产生,保持提交曲线为直线,让大家易于理解。
git rebase --continue //修改冲突后直接提交
git rebase --abort //中止本次rebase操作
git reflog查看所有记录版本
//如果在回退以后又想再次回到之前的版本,git reflog 可以查看所有分支的所有操作记录(包括commit和reset的操作),包括已经被删除的commit记录,git log则不能察看已经删除了的commit记录
615ce06 HEAD@{44}: rebase -i (finish): returning to refs/heads/my_test_branch
615ce06 HEAD@{45}: rebase -i (fixup): zancun_new
702356c HEAD@{46}: rebase -i (fixup): # This is a combination of 2 commits.
c997622 HEAD@{47}: rebase -i (reword): zancun_new
fb74ec2 (origin/master, origin/HEAD) HEAD@{48}: rebase -i (start): checkout FETCH_HEAD
f3ef592 HEAD@{49}: commit: zancun3
6b82c75 HEAD@{50}: commit: zancun2
e900fa0 HEAD@{51}: commit: zancun
//比如说,回退到commit: zancun3,只需要:
git reset --hard f3ef592 (或者HEAD@{49}) 即可
//这个命令对于找回丢失的代码非常有用。
//--soft的妙用
//使用--soft只回退commit,修改代码没有回退,此时可以重新生产commit,用于整合新修改的代码合并到同一个commit下
git pull --rebase origin master //远程代码与本地代码冲突时,更新当前本地仓库代码
//修改已提交commit
运行git rebase --interactive commitid^。注意^,我们要rebase到要修改的commit的前一个commit。
在跳出的编辑器中,将commitid所在行的pick改成edit
git commit --amend
git rebase --continue
git push origin master -f //强制推送至远程仓库
git stash暂存代码
git stash # 保存某次修改,所有未提交的修改都保存起来,用于后续恢复当前工作目录
git reflog # 查看历史命令
git revert # 回退某个修改
git stash pop / git stash apply
恢复最新缓存的工作目录(第一个),并删除缓存堆栈中的那一个stash删除(pop), apply则只恢复不删除
$ git stash list
查看现有所有stash
在使用git stash pop(apply)命令时可以通过名字指定使用哪个stash,默认使用最近的stash(即stash@{0})
$ git stash drop
移除最新的stash,后面也可以跟指定stash的名字
patch的生成
当前分支所有超前master的提交:
git format-patch -M master
某次提交以后的所有patch:
git format-patch 4e16 --4e16指的是commit名
某次提交的patch:
git format-patch -1 4e16 --4e16指的是commit名
打补丁:
常用命令git patch 、git apply、git am
git diff 和 git format-patch 生成的补丁文件都可以使用git patch 、git apply来打补丁,但是 git am 仅可以用于git format-patch 生成的补丁。
git patch -p1 < patch_files或者直接使用git apply patch_files
注意,在执行 patch 命令时,指定-p1,当 位置是在哪里制作的patch,就在哪里执行patch 或者 apply。
git am patch_files
先检查patch文件:git apply --stat newpatch.patch
检查能否应用成功:git apply --check newpatch.patch
打补丁:git am newpatch.patch
同时打多个补丁:
git format-patch+ git am 多个patch
1.生成多个patch(git format-patch commitid会生成这个commit之后的所有patch,不包含该commit)
2. 打补丁(git am *.patch可以打进去所有patch)
git diff的使用:
显示工作区与当前分支之间的差异。但是这个指令有一个问题,就是无法显示出 Untracked files ,所以用这个命令生成的patch就无法添加 untracked files 。
git diff --cached > diff.patch或者git diff --staged > diff.patch
显示暂存区与当前分支之间的差异,这个指令就可以对新增加的文件进行添加,前提是需要先 git add 将需要增加的文件,添加到暂存区。
git diff --cached/--staged/commit commit > diff.patch
git push推送代码
将代码推到远程仓库
(1)一般形式为 git push <远程主机名> <本地分支名>:<远程分支名>
git push origin master:master //与下面省略远程分支名master等同
注:<本地分支名>:<远程分支名> 中间的分号两边不能有空格
(2)省略远程分支名,git push <远程主机名> <本地分支名>
推送到与本地分支同名的远程分支,如远程没有则创建
git push -u origin master
//如果当前分支与多个主机存在追踪关系,则可以使用 -u 参数指定一个默认主机(第一次推送使用),这样后面就可以不加任何参数使用git push
注意:
在推送到远程仓库前记得git pull同步一下远程仓库代码。
git pull同步更新远程仓库代码及冲突处理
git pull origin branch
git pull //直接更新当前分支代码
冲突处理:
1、修改nvme_data_xfer.c冲突部分代码;
2、制作commit;
git add .
git rebase --continue
git commit -m "xxxx" //此时重新制作commit即可
取消本次合并
git rebase --abort
远程仓库有更新如何选择merge还是rebase方式pull最新代码
git config pull.rebase false :Git 将默认使用 merge 的方式来合并分支,将本地代码和远程代码合并成一个新commit,从而避免了 rebase 带来的潜在问题。
git config pull.rebase true: rebase 的好处是可以保持提交历史的线性,避免了 merge 产生的分支合并记录。
git show查看更改代码内容
1、查看当前commit更改内容:
首先查看commit:
[root@localhost /]# git log //commit后面的数字
[root@localhost /]# git show 8290c4a7a6d83069ce3667e15306a84f60b228b4
2、查看前几次更改
[root@localhost /]# git show -2 //前两次更改
[root@localhost /]# git show HEAD~2 //第2次更改内容
git check-ignore查看被忽略文件
有时候发现提交一个文件被git忽略掉,想要查看哪里写了忽略规则把它忽略掉了。
git check-ignore -v 被忽略的文件或文件夹
root@LINUX:/home/test/linux/drivers# git check-ignore -v ./scsi/scsi_devinfo_tbl.c
test/drivers/scsi/.gitignore:2:scsi_devinfo_tbl.c ./scsi/scsi_devinfo_tbl.c
//忽略某个文件不提交
git rm --cached src/test.sh
//新增.gitignore后建议将缓存文件清掉
git rm -r --cached .
[root@localhost /]# git status --ignored
//忽略的文件都记录在.gitignore中
git config新增配置
1、增加远程仓库地址:
git config remote.origin.url "ssh://xxx@192.168.1.98:xxx"
2、修改默认使用vim编辑器
git config --global core.editor vim
3、删除全局git配置
git config --global --unset user.name
git remote远程仓库操作
将本地代码和分支更新:
git remote update origin --prune
git cherry-pick合并其他分支某个commit
git cherry-pick feature
//上面代码表示将feature分支的最近一次提交,转移到当前分支
git cherry-pick <HashA> <HashB>
//上面的命令将 A 和 B 两个提交应用到当前分支。这会在当前分支生成两个对应的新提交。
//如果想要转移一系列的连续提交,可以使用下面的简便语法。
git cherry-pick A..B
//上面的命令可以转移从 A 到 B 的所有提交。它们必须按照正确的顺序放置:提交 A 必须早于提交 B,否则命令将失败,但不会报错
git add .
git cherry-pick --continue
//修改冲突后,提交合并的commit
git rebase删除/修改/合并commit
1、删除
比如我的提交历史如下,我现在想删除commit_B,但是不影响commit_B之后的提交历史
commit_C
commit_B
commit_A
首先找到commit_B提交之前的一次提交的commit_A
执行如下命令
git rebase -i commit_A
将commit_B这一行前面的pick改为drop,然后按照提示保存退出,可以使用git log查看已删除commit_B
2、修改
(1)执行如下命令
git rebase -i commit_A
将commit_B这一行前面的pick改为edit,然后按照提示保存退出,可以使用git log查看已删除commit_B
注意:commit_A应为要修改的commit_B的前一个提交的commit
(2)修改某个log,保存退出
git commit --amend
(3)重定位到最新commit
git rebase --continue
3、合并多个commit
(1)执行如下命令
git rebase -i commit_A
将commit_B这一行前面的pick改为squash,然后按照提示保存退出,可以使用git log查看已删除commit_B
(2)
此时会重新自动打开一个新的包含所有commit log的文件,将不需要的commit前面加入#注释,留下一个可以修改对应的log,保存即可。
修改某个commit的log
git commit --amend <commit_A>
git restore回退单个文件
git restore <file>..." //丢弃工作区的改动
git add后回退成非add状态
git restore --staged <file>
在远程仓库中新增key之后git pull还要输入账号密码
//设置远程仓库地址为ssh地址
git config --global remote.origin.url git@xxx
//或者
git config --global remote.origin.url ssh://xxx
git blame指定文件的内容,并在每一行注释上显示具体修改信息
//输出文件每行的提交记录
git blame <file>
git blame drivers/spi/spi.c
//输出某文件从第几行到第几行的最近一笔提交记录
git blame -L <开始行数>,<结束行数> <file>
git blame drivers/spi/spi.c -L 100,105
.gitignore不生效
解决方法就是先修改.gitignore文件,之后在执行以下内容先把本地缓存删除(改变成未track状态),然后再提交。
git rm -r --cached .
git add .
git commit -m "xxx"
git tag打标签用于版本发布
打标签
git tag -a v0.0.2 -m "add dn200_2_port_pf_v0.0.2.bin for release"
提交标签到远程仓库
git push origin --tags
删除标签:
git tag -d v0.0.2
注解:-d 表示删除,后面跟要删除的tag名字;;
删除远程标签
git push origin :refs/tags/v0.0.2
查看某个tag的详情:git show v0.0.2
git clean 命令用于从工作目录中删除未被 Git 跟踪的文件或文件夹
git clean <options>
默认情况下,git clean 只删除工作目录中未被追踪的文件和文件夹。使用 -n 选项可以进行预览,查看将要被删除的文件,而不实际执行删除操作:
git clean -n
要真正执行删除操作,可以使用 -f 选项:
git clean -f
git clean 还支持交互式模式,通过 -i 选项可以在删除之前逐个确认是否删除文件:
git clean -i
git submodule update --init 和 --remote的区别
git submodule update --init 会初始化子模块,将子模块的代码下载到本地,子项目提交的时候并不会修改.gitmodule里面的版本
git submodule update --init --remote是更新子模块代码并初始化子模块的命令,子项目会根据.gitmodule的版本进行更新