当前位置: 首页 > 工具软件 > Git sym > 使用案例 >

版本管理工具——git常用命令使用总结

潘翊歌
2023-12-01

git代码库管理命令

在实际的项目开发过程中,一个工程通常分为测试分支和线上分支,测试分支通常对应测试环境,线上分支的代码对应线上环境。使用git作为代码管理工具,可以方便地进行代码的迭代管理,多人协同开发,有利于提升开发效率。在使用git过程中,有一些经常使用的命令,熟练使用这些命令进行代码管理是程序开发过程中的基础。

分支管理

在代码的迭代过程中,分支管理是经常遇到的问题之一,通常一个项目分为线上分支(一般使用master或online表示)、测试分支(一般使用dev表示)、及其他个人分支。代码的上线流程通常是,将本地代码提交到线上个人代码库,然后提交一个merge request到测试分支,复看代码没问题,上测试环境,前后端简单调试或者产品简单测试没问题后,提交到线上分支,上线上环境,等待质量保证部门全面测试。

更新代码通常都是从线上分支拉取(到本地)最新的代码,从本地重新起个分支,在本地自己的分支上进行代码开发,以免代码混乱。

拉取线上代码到本地

$ pwd
/xxx/go/src/golang.xxx.com/bi/newbi_xxx

$ git branch    //查看分支
* newbi_sym
  online

$ git checkout online  //切换到online分支
error: Your local changes to the following files would be overwritten by checkout:
	service/http/handler/data_model_detail.go
Please commit your changes or stash them before you switch branches.
Aborting

$ git stash    //暂存本地改变
Saved working directory and index state WIP on newbi_sym: cba923a 添加默认时间字段的bug修复

$ git checkout online    //暂存本地代码后,切换到origin/online分支
Switched to branch 'online'
Your branch is behind 'origin/online' by 114 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

$ git branch             //检查,可以看到现在已经切换到online分支
  newbi_sym
* online

$ git pull               //从online分支拉取最新代码
remote: Counting objects: 727, done.
remote: Compressing objects: 100% (469/469), done.
remote: ......

$ git checkout -b sym_online1    //新建并切换到本地个人分支sym_online1
Switched to a new branch 'sym_online1'

shenymdeMacBook-Pro:newbi_datamodel shenym$ git branch //查看现在的本地分支,还是在个人分支sym_online1
  newbi_sym
  online
* sym_online1

git克隆指定分支代码:git clone -b 分支名 仓库地址

参考https://www.cnblogs.com/nylcy/p/6569284.html
From version 7.12, GitLab CI uses a YAML
file (.gitlab-ci.yml) for the project configuration. It is placed in the root
of your repository and contains definitions of how your project should be built.

克隆
git branch -r #查看远程分支
或
git branch -a #查看所有分支

1.git clone 仓库地址(不指定分支)

//这种方式的git clone 默认会把远程仓库整个给clone下来
git clone http://10.1.1.11/service/tmall-service.git //每个仓库有个默认的分支(在.gitlab-ci.yml中可以配置),如果不指定分支,那么就使用默认分支。bi-venus和newbi的默认分支都是online。

2.git clone 指定分支

git clone -b dev_jk http://10.1.1.11/service/tmall-service.git
命令中:多了一个 -b dev-jk,这个dev_jk就是分支,http://10.1.1.11/service/tmall
-service.git为源码的仓库地址

原文:https://blog.csdn.net/weixin_39800144/article/details/78205617

本地代码提交到线上代码库

由于所有的上线代码都放在online分支,而本地代码在修改后可能已经落后线上online分支几个版本,所以在提交本地代码之前需要先从online分支拉取最新的代码。

git pull origin online
git add ./*   //添加本地所有更改的代码
git commit -m "说明本次改变的功能"   //提交本次代码变更的注释

在更改代码,未提交更改之前,可以通过如下命令查看代码状态变化及代码变化。

git status    //查看分支状态
On branch sym_online1
Your branch is ahead of 'origin/sym_online1' by 1 commit.
  (use "git push" to publish your local commits)

git diff      //查看本次提交与上一个版本的差别
git push      //将本地更改的代码推到代码库,如果是第一次推送,没有与git远端代码库建立联系,会报如下问题
fatal: The current branch sym_online1 has no upstream branch.
To push the current branch and set the remote as upstream, use
    git push --set-upstream origin sym_online1

git push --set-upstream origin sym_online1  //设置远端上升流,并将本地代码推送到远端库

git fetch和git pull的区别

1.查看远程仓库的信息

可以通过命令 git remote show [remote-name] 查看某个远程仓库的详细信息,比如要看所克隆的 origin 仓库,可以运行:

git remote show origin

2.git fetch:相当于从远程获取最新版本到本地,不会自动merge

git fetch origin master
git log -p master origin/master
git merge origin/master

上面的含义分别是:
从远程仓库 抓取master分支,但是不会merge
比较本地master分支与远程master分支的区别
合并远程分支到本地

上述过程其实可以用以下更清晰的方式来进行:

git fetch origin master:tmp
git diff tmp 
git merge tmp

3.git pull:相当于从远程获取最新版本并merge到本地

 git pull origin master

上述命令其实相当于git fetch 和 git merge
在实际使用中,git fetch更安全一些
因为在merge前,我们可以查看更新情况,然后再决定是否合并

原文:https://blog.csdn.net/TH_NUM/article/details/77847031

git stash暂存修改

有时候你正在写代码,写到一半的时候需要切到另一个分支修改一个bug,这时直接切换分支是不行的,会提示让你先提交修改或者暂存起来。代码写到一半显然不能直接提交到仓库,这时候就需要用到git stash命令了,命令如下:
git stash // 把当前进度保存到暂存区
再输入命令git status 就会告诉你nothing to commit,这时我们就可以正常切换分支了,在另一个分支修改完成并提交之后,再切回到当前分支,可以使用下面的命令恢复最新进度到工作区:
git stash pop // 恢复最新的进度到工作区
然后我们就可以接着愉快的写代码了。
这只是简单的暂存与恢复命令,还可以参考以下命令,结合使用
git stash save ‘message’同git stash只不过增加了一些注释信息
git stash list显示暂存列表
git stash pop [stash]默认弹出最上面的那一条即stash@{0},还可以指定弹出那一条及pop后加stash@{n}
git stash drap [stash]默认丢弃最上面的那一条即stash@{0},可以指定弹出哪一条同上
git stash clear清除所有的stash
git show stash@{n}通过此命令可以查看stash的详情
git apply stash@{n}与pop类似,只不过不会丢弃stash
其他更多关于stash的命令请使用git stash –help命令查看Git manual。

git diff比较不同分支之间的差异

git diff 也是主要用来比较两次提交的差异。注意:git diff 这个命令在git add 、git commit 、git push命令之前执行,才会显示本地仓库中的修改与上一个版本之间的差异。

工作区
工作区就是我们平时工作的本地仓库,此时的仓库是没有经过add的。

暂存区
暂存区是git add 之后,但未进行提交的部分。此部分为暂存区。如果我们直接执行 git diff 而不加任何参数的时候,比较的就是工作区和暂存区。

比较同一个文件在两个不同分支下的差异

git diff branch1 branch2 --stat //显示出所有有差异的文件列表
git diff branch1 branch2 文件名(带路径) //显示指定文件的详细差异
git diff branch1 branch2 //显示出所有有差异的文件的详细差异

git diff 分支1名 分支2名 文件名
例:

git diff test origin/master test1
 
diff --git a/test1 b/test1
deleted file mode 100644
index 58c9bdf..0000000
--- a/test1
+++ /dev/null
@@ -1 +0,0 @@
-111

多个文件的比较

git diff --name-only HEAD^^|grep -v test_dir |xargs git diff test master

过滤掉不关心的文件/文件夹
git diff --name-only [HEAD or commit id] | grep -v [要过滤的文件名/文件夹名]

例: git diff --name-only HEAD^^|grep -v test_dir
结果
test1

git diff的一些常用操作

git diff HEAD 显示工作目录与git 仓库之间的差异;

git diff HEAD^ 是比较上次的提交;

git diff HEAD~2 是比较上两次提交,于是有了,git diff HEAD~n 是比较上n次提交与现在工作区间的关系;

其他一些常用命令

git grep全文搜索

1、使用场景
比如我们要在git项目中查找某个字符串等,就可以使用这个命令。这个grep类似于linux中的grep,都是搜索的意思。

2、实例
git grep -R ‘xxx’ ./app/
//搜索在app目录下的所有xxx字符串
1)这里的-R就相当于全部搜索。
2)xxx相当于要搜索的字符串
3) ./app/是我要搜索的目录
4)结果会显示这个字符串出现在文件中的具体位置,我们根据提示就可以轻易找到

git push origin -d 删除远端分支

每个分支开发结束,代码合并入 git代码库的dev测试、master/online线上分支之后,自己的分支就没必要一直保留了,这样代码库的分支会越来越多,可以每次个人分支合并到dev/master/online分支之后,将本地/远端的个人分支清理掉。
清理本地分支命令:git branch -d branch_name

git checkout online                 //先切换到其他分支
git branch -d branch_name       //然后删除本地分支
git pull origin online                    //再从线上分支拉取最新代码
git checkout -b new_branch      //新建并切换到新分支,在最新线上分支的基础上修改代码

清理远端分支命令:git push origin --delete branch_name
git push origin --delete branch_name
舍弃本地分支修改
参考原文:https://blog.csdn.net/u012672646/article/details/56676804

git checkout . && git clean -df     //可以放弃所有修改、新增、删除文件

git checkout .   //放弃本地修改,没有提交的可以回到未修改前版本
git clean  是从工作目录中移除没有track的文件。

通常的参数是git clean -df,其中-d表示同时移除目录,-f表示force,因为在git的配置文件中,clean.requireForce=true,如果不加-f,clean将会拒绝执行。

或者使用如下命令,将本地分支新增(修改)的代码恢复到未修改之前:
参考https://blog.csdn.net/leedaning/article/details/51304690

git checkout . #本地所有修改的。没有的提交的,都返回到原来的状态
git stash #把所有没有提交的修改暂存到stash里面。可用git stash pop恢复
git reset --hard HASHCode #返回到某个节点,不保留修改
git reset --soft HASHCode #返回到某个节点,保留修改

git clean -df #返回到某个节点
git clean 参数
    -n 显示将要删除的文件和目录,-n参数表示“dry-run”即演练不实际执行
    -d 表示移除目录
    -f 表示强制删除文件
    -x 表示仅删除.gitignore里标记过的文件,那些既不被git版本控制,又不在.gitignore中的文件会被保留。
    -df 表示同时删除文件和目录

注意慎用:git clean -xdf 命令,这个是危险命令,执行这个前先执行git clean -nxdf以显示将要删除的文件和目录,再做决定是否确定执行git clean -xdf命令删除这些文件和目录。注意一旦执行这个-xdf命令以后,所有被.gitignore忽略的文件和文件夹全部删了,而且回收站里也找不回来了

常见问题与解决方式

一个分支结构目录发生了很大的改变(例如新增了几个 module)或者是进行了代码工程结构的调整;此时如果从该分支切换到其他分支,由于配置了 .gitignore 文件,新增的 module产生的临时文件或者一些untracked 文件不会被自动删除;此时工程目录结构就会产生很多对当前分支来说多余的文件夹。那么遇到这种问题如何解决呢?
只需要在 git checkout 目录之后执行 git clean -df 命令就可以清理待多余的文件夹,拥有一个清新的目录结构

在git中忽略指定文件

在使用git管理代码时,有时需要将指定的文件排除在外(不上传到gitlab代码库),例如使用vs code编辑代码时,会在当前项目的./vscode目录中经常出现launch.json这个配置文件,如果没注意就会把这个配置文件推送到代码库。所以,在每次拉代码时,需要在该项目的.gitignore文件中,将指定文件忽略掉(不上传代码库),在.gitignore文件中直接加入要忽略文件的(相对)路径和文件名即可,如下将.vscode/目录下的所有文件忽略。

.dockerignore
.idea/
.med/
*.test
*.so
tmp/
*.txt
*.text
*_back
*#*#
config.toml
.vscode/

删除文件与恢复

有一次在main包里面创建测试文件后,本来想要删除测试文件test.go,却不小心删除了main.go文件,针对这种场景,如何恢复误删误删的文件呢?

$ git rm cmd/http/main.go    // 删除main.go文件
rm 'cmd/http/main.go'

$git status							// 查看状态,已删除
On branch fix_develop_conflict_syncvideo
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        deleted:    cmd/http/main.go

$git reset HEAD cmd/http/main.go
Unstaged changes after reset:
D       cmd/http/main.go

$git checkout cmd/http/main.go

git回滚代码

在使用git进行代码管理过程中,难免因为上线某个功能或分支后出现问题,或者合错代码,需要回滚到某个commit。具体回退命令有以下几种方式:

git reset --hard HEAD^ 回退到上个版本

git reset --hard HEAD~3 回退到最近3次提交的代码之前,以此类推,n表示回退到n次提交之前

git reset --hard commit_id 退到/进到,指定commit的哈希码(这次提交之前或之后的提交都会回滚)

回滚后提交可能会失败,必须强制提交

强推到远程:(可能需要解决对应分支的保护状态)
git push origin HEAD --force

参考

git 删除文件后如何恢复
git rm -rf 删除文件恢复
git 回滚代码版本的几种方式

 类似资料: