在实际的项目开发过程中,一个工程通常分为测试分支和线上分支,测试分支通常对应测试环境,线上分支的代码对应线上环境。使用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
参考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 #查看所有分支
//这种方式的git clone 默认会把远程仓库整个给clone下来
git clone http://10.1.1.11/service/tmall-service.git //每个仓库有个默认的分支(在.gitlab-ci.yml中可以配置),如果不指定分支,那么就使用默认分支。bi-venus和newbi的默认分支都是online。
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 remote show [remote-name] 查看某个远程仓库的详细信息,比如要看所克隆的 origin 仓库,可以运行:
git remote show origin
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
git pull origin master
上述命令其实相当于git fetch 和 git merge
在实际使用中,git fetch更安全一些
因为在merge前,我们可以查看更新情况,然后再决定是否合并
原文:https://blog.csdn.net/TH_NUM/article/details/77847031
有时候你正在写代码,写到一半的时候需要切到另一个分支修改一个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 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 HEAD 显示工作目录与git 仓库之间的差异;
git diff HEAD^ 是比较上次的提交;
git diff HEAD~2 是比较上两次提交,于是有了,git diff HEAD~n 是比较上n次提交与现在工作区间的关系;
1、使用场景
比如我们要在git项目中查找某个字符串等,就可以使用这个命令。这个grep类似于linux中的grep,都是搜索的意思。
2、实例
git grep -R ‘xxx’ ./app/
//搜索在app目录下的所有xxx字符串
1)这里的-R就相当于全部搜索。
2)xxx相当于要搜索的字符串
3) ./app/是我要搜索的目录
4)结果会显示这个字符串出现在文件中的具体位置,我们根据提示就可以轻易找到
每个分支开发结束,代码合并入 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管理代码时,有时需要将指定的文件排除在外(不上传到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进行代码管理过程中,难免因为上线某个功能或分支后出现问题,或者合错代码,需要回滚到某个commit。具体回退命令有以下几种方式:
git reset --hard HEAD^ 回退到上个版本
git reset --hard HEAD~3 回退到最近3次提交的代码之前,以此类推,n表示回退到n次提交之前
git reset --hard commit_id 退到/进到,指定commit的哈希码(这次提交之前或之后的提交都会回滚)
回滚后提交可能会失败,必须强制提交
强推到远程:(可能需要解决对应分支的保护状态)
git push origin HEAD --force