- 当前修改未 add 时,切换分支,修改会被带过去覆盖
- 当前修改 add 了,但是没有commit,切换分支还是会被带过去
- 只有
git status
看不到有修改的东西的提示时,切换分支才不会被带过去 git clone -b <branch_name/ tag_name> --depth=1 url
克隆指定分支或者tag的仓库git blame <filename> [-L a,b]
列出文件中每一行的commit id, 作者,提交日期等;-L 参数表示后面接的是行号(Line), a,b代表查询文件的第a行到第b行之间的文件内容情况。git rebase -i <base-commit>
在一个分支上产生了很多的无效的提交,这种情况下使用 rebase 的交互式模式可以把已经发生的多次提交压缩成一次提交,得到了一个干净的提交历史 git rebase vs git merge
也可以用于将之前的一个提交重新添加message,相当于重新提交一下- 使用
rebase
进行pull
直接使用git pull拉取代码,被同事狠狠地diss了
git pull --rebase
或设置默认git config --global pull.rebase true
- 5条提高效率的命令
https://mp.weixin.qq.com/s/J4Q6YpuOSAy3GvIXdqmMfQ
stash:存储临时代码,不止 stash pop 还有 stash apply等
reset --soft:软回溯,回退 commit 的同时保留修改内容。
cherry-pick:复制某次 commit 到别的分支。
revert:撤销某次 commit 的修改内容,不同于reset,revert只会应该指导的commit提交的内容。
reflog:记录了 commit 的历史操作。
- 需要从别的repo上提取某次的提交,将其应用到我自己的repo上
# 进到自己的目录
cd xupeng
# 添加源仓库,命名为source(之前我们熟悉的都是origin)
git remote add source <URL>
# 获取源仓库指定分支
git fetch source <source_branch>
# 找到需要提交的commit id
git log source/source_beanch
# 在我的repo分支上合并特定提交
git cherry-pick <commit id>
# 推送
git push
- git status默认会显示文件内容和文件权限修改,如果只想显示文件内容,忽略文件权限
git config core.fileMode false
或
git config -add core.fileMode false
或
git config --global core.fileMode false
几个高级技巧
https://mp.weixin.qq.com/s/JI49F5nr7xeOBAAj3Q3agg
# add & commit,不用先add 再 commit,可以使用 -am 合并成一个命令
git commit -am "new project"
# amend
# 可以在将当前提交推送到远程存储库之前对其进行其他更改,要保留以前的提交消息,要使用 “--no-edit” 标志
git add .
git commit --amend
# 我们想推送本地提交并覆盖远程历史记录(不推荐)
git push origin master --force
# 要撤消 Git 中的提交,可以使用 revert 命令。但是,此命令不会删除任何提交。相反,它会创建一个新的提交来撤消原始提交所做的更改。
git log --oneline
git revert 8f184d5
# 重命名分支
git branch -M main
# 查看日志
git log --graph --decorate --oneline
# 切回上一个分支
git checkout -
# 用远程存储库覆盖本地
git fetch origin
git reset --hard origin/master
如果仍有未跟踪的文件,可以使用以下命令将其删除:
git clean -df
GIT开发流程
https://mp.weixin.qq.com/s/1iR4XgxDeO08NZFMEGdRBw
1. 拉取代码
git clone https://code.xxx.com/xxx/xxx.git
2. 初次开发需求前,要先拉取生产/预发分支,然后基于这个分支之上,创建自己的特性分支进行开发
git fetch origin release:release
git checkout release
git checkout -b feat-0131-jie
如果不是初次开发,本地已有生产/预发分支,则需要重新拉取远程的最新代码,然后再创建
git checkout release
git pull origin release
git checkout -b feat-0229-jie
分支名规范
分支责任-需求日期/需求号-开发人姓名
,一般按部门规范来,常见的有以下几种。
- feat:新功能
- fix:修补bug
- doc:文档
- refactor:重构(即不是新增功能,也不是修改bug的代码变动)
- test:测试
- chore:构建过程或辅助工具的变动
注意2:为啥拉取的是生产/预发分支 之所以要拉取 release/uat 分支而不是拉取
dev/test,是因为后者可能包含着一些其他成员还未上线或者可能有 bug
的需求代码,这些代码没有通过验证,如果被你给拉取了,然后又基于此进行新的需求开发,那当你需求开发完成,而其他成员的需求还没上线,你将会把这些未验证的代码一起发送到
uat/release 上,导致一系列问题。
3. 需求开发完成,提交&合并代码
首先先在本地把新的改动提交,提交描述的格式可以参考着分支名的格式
git add .
git commit -m "提交描述"
在合并代码时,我们要将四种分支模型(dev、test、uat、release)作为参照物,而不是把关注点放在自己的分支上。比如我们要在 dev 上调试,那就需要把自己的分支合并到 dev 分支上;如果我们需要提测,则把自己的分支合并到 test 分支上,以此类推。
第一种:线上合并,也是推荐的规范操作
git push origin feat-0131-jie
先按照上面命令将自己的分支推送到远程仓库。
然后在线上代码仓库中,申请将自己的分支合并到 xx 分支(具体是哪个分支就根据你当前的开发进度来,如 test),然后在线上解决冲突。
第二种,本地合并(前提你要有对应环境分支 push 的权限)
## 先切换到你要提交的环境分支上,如果本地还没有就先拉取下来
git fetch origin test:test
git checkout test
## 然后将自己的分支合并到环境分支上(在编辑器解决冲突)
git merge feat-0131-jie
## 最后将环境分支推送到远程仓库
git push origin test
4. 验收完成,删除分支
git branch -d <分支名>
## 如果要强制删除分支(即使分支上有未合并的修改)
git branch -D <分支名>
代码合并错误,并且已经推送到远程分支,如何解决?
首先切换到特性分支合并到的错误分支,比如是 release
git checkout release
然后查看最近的合并信息
git log --merges
撤销合并
git revert -m 1 <merge commit ID>
最后,撤销远程仓库的推送
git push -f origin release