ToB企服应用市场:ToB评测及商务社交产业平台

标题: Git指南-从入门到精通 [打印本页]

作者: 熊熊出没    时间: 2025-2-13 07:52
标题: Git指南-从入门到精通
代码提交和同步命令

流程图如下:

  1. $ git status
  2. $ git add <冲突文件>--all # 当前项目下的所有更改
  3. $ git add <冲突文件>.  # 当前目录下的所有更改
  4. $ git add <冲突文件>xx/xx.py xx/xx2.py  # 添加某几个文件
复制代码
  1. $ git commit -m "<这里写commit的描述>"
复制代码
  1. $ git push -u origin master # 第一次需要关联上
  2. $ git push # 之后再推送就不用指明应该推送的远程分支了
  3. $ git branch # 可以查看本地仓库的分支
  4. $ git branch -a # 可以查看本地仓库和本地远程仓库(远程仓库的本地镜像)的所有分支
复制代码
一般来说,在某个分支下,最常用的操作如下:
  1. $ git status
  2. $ git add <冲突文件>-a
  3. $ git status
  4. $ git commit -m 'xxx'
  5. $ git pull --rebase
  6. $ git push origin xxbranch
复制代码
代码撤销和撤销同步命令

流程图如下:

已修改,但未暂存
  1. $ git diff # 列出所有的修改
  2. $ git diff xx/xx.py xx/xx2.py # 列出某(几)个文件的修改
  3. $ git checkout <file-name># 撤销项目下所有的修改
  4. $ git checkout <file-name>. # 撤销当前文件夹下所有的修改
  5. $ git checkout <file-name>xx/xx.py xx/xx2.py # 撤销某几个文件的修改
  6. $ git clean -f # untracked状态,撤销新增的文件
  7. $ git clean -df # untracked状态,撤销新增的文件和文件夹
  8. # Untracked files:
  9. #  (use "git add <冲突文件><file>..." to include in what will be committed)
  10. #
  11. #        xxx.py
复制代码
git checkout 与后文的切换分支命令几乎同等,究竟上,checkout 作为单个命令有点超载(它承载了许多独立的功能),因此在 Git 2.23 版本中,引入了一个名为 git switch 的新命令,最终会代替 git checkout
已暂存,未提交

这个时候已经执行过git add,但未执行git commit,但是用git diff已经看不到任何修改。 因为git diff检查的是工作区与暂存区之间的差异。
  1. $ git diff --cached # 这个命令显示暂存区和本地仓库的差异
  2. $ git reset <file-name># 暂存区的修改恢复到工作区
  3. $ git reset <file-name>--soft # 与git reset等价,回到已修改状态,修改的内容仍然在工作区中
  4. $ git reset <file-name>--hard # 回到未修改状态,清空暂存区和工作区
复制代码
git reset --hard 操作等价于 git reset 和 git checkout 2步操作
已提交,未推送

执行完commit之后,会在仓库中天生一个版本号(hash值),标志这次提交。之后任何时候,都可以借助这个hash值回退到这次提交。
  1. $ git diff <branch-name1> <branch-name2> # 比较2个分支之间的差异
  2. $ git diff master origin/master # 查看本地仓库与本地远程仓库的差异
  3. $ git reset <file-name>--hard origin/master # 回退与本地远程仓库一致
  4. $ git reset <file-name>--hard HEAD^ # 回退到本地仓库上一个版本
  5. $ git reset <file-name>--hard <hash code> # 回退到任意版本
  6. $ git reset <file-name>--soft/git reset # 回退且回到已修改状态,修改仍保留在工作区中。
复制代码
已推送到远程
  1. $ git push -f orgin master # 强制覆盖远程分支
  2. $ git push -f # 如果之前已经用 -u 关联过,则可省略分支名
复制代码
慎用,一般情况下,本地分支比远程要新,所以可以直接推送到远程,但有时推送到远程后发现有问题,进行了版本回退,旧版本或者分叉版本推送到远程,需要添加 -f参数,表现逼迫覆盖。
其它常用命令

关联远程仓库

  1. $ git init
复制代码
  1. $ git remote add <name> <git-repo-url>
  2. # 例如 git remote add origin https://github.com/xxxxxx # origin是远程仓库的名称
复制代码
  1. $ git remote add <name> <another-git-repo-url>
  2. # 例如 git remote add coding https://coding.net/xxxxxx
复制代码
  1. $ git remote -v
  2. # origin https://github.com/Seven-97/SevenBlog.git (fetch)
  3. # origin https://github.com/Seven-97/SevenBlog.git (push)
复制代码
  1. $ git clone <git-repo-url>
  2. # 关联的远程仓库将被命名为origin,这是默认的。
复制代码
  1. $ git remote set-url origin <your-git-url>
复制代码
配置自己的Git

  1. $ git config --list
复制代码
  1. $ git config --global user.name "<name>"
  2. #  --global为可选参数,该参数表示配置全局信息
复制代码
  1. $ git config --global user.email "<email address>"
复制代码
  1. $ git config --global alias.logg "log --graph --decorate --abbrev-commit --all"
  2. # 之后就可以开心地使用 git log了
复制代码

切换分支

新建仓库后,默认天生了master分支

  1. $ git checkout <file-name>-b <new-branch-name>
  2. # 例如 git checkout -b dev
  3. # 如果仅新建,不切换,则去掉参数 -b
复制代码
  1. $ git branch
  2. # * dev
  3. #   master # 标*号的代表当前所在的分支
复制代码
  1. $ git branch -a
  2. # * dev
  3. #   master
  4. #   remotes/origin/master
复制代码
  1. $ git checkout <file-name>master
复制代码
更新本地/远端代码 push/poll

  1. $ git push origin master
  2. # 你可以使用git push -u origin master将本地分支与远程分支关联,之后仅需要使用git push即可。
复制代码
  1. $ git pull origin <branch-name>
  2. # 之前如果push时使用过-u,那么就可以省略为git pull
复制代码
  1. $ git stash # 工作区修改暂存
  2. $ git pull  # 更新分支
  3. $ git stash pop # 暂存修改恢复到工作区
复制代码
git pull 实际上包含了两个操作:fetch和merge。当使用git pull命令时,Git会自动下载最新代码,并尝试将最新代码合并到当前分支。git fetch命令只是从远程库下载最新代码,但并不自动合并到本地分支。
撤销操作 reset

  1. $ git checkout <file-name>
复制代码
  1. $ git checkout <file-name>.
复制代码
  1. $ git reset <file-name>
复制代码
  1. $ git reset <file-name>--hard # 如果是回退版本(commit),那么file,酿成commit的hash码就好了。
复制代码
  1. $ git revert <commit-hash>
  2. # 实质是新建了一个与原来完全相反的commit,抵消了原来commit的效果
复制代码
  1. $ git reflog #查看近来操作记录$ git reset <file-name>--hard HEAD{5} #恢复到前五笔操作$ git pull origin backend-log #再次拉代替码
复制代码
版本回退与前进 status、log、reflog

  1. $ git status
复制代码
  1. $ git log
  2. commit 9a3d34be1e26563e198ee6aea72d32ad68b607d0 (HEAD -> main, origin/main, origin/HEAD)
  3. Author: seven <415849169@qq.com>
  4. Date:   Tue Jul 9 19:10:11 2024 +0800
  5.     更新
  6. commit 47c32de67a28df58ea3bd0b88137f1bd19a12969
  7. Author: Seven <415849169@qq.com>
  8. Date:   Tue Jul 9 00:30:11 2024 +0800
  9.     更新
  10. commit 294814faf55fc4f01e3b0a28c96b5acdf1348333
  11. Author: Seven <415849169@qq.com>
  12. Date:   Tue Jul 9 00:22:15 2024 +0800
  13.     更新内容
  14. commit 15026d42c4d3a6093bde4578484e2bb64824b9e8
  15. Author: Seven <415849169@qq.com>
复制代码
  1. $ git log --graph --decorate --abbrev-commit --all
  2. * commit 9a3d34b (HEAD -> main, origin/main, origin/HEAD)
  3. | Author: seven <415849169@qq.com>
  4. | Date:   Tue Jul 9 19:10:11 2024 +0800
  5. |
  6. |     更新
  7. |
  8. * commit 47c32de
  9. | Author: Seven <415849169@qq.com>
  10. | Date:   Tue Jul 9 00:30:11 2024 +0800
  11. |
  12. |     更新
  13. |
  14. * commit 294814f
  15. | Author: Seven <415849169@qq.com>
  16. | Date:   Tue Jul 9 00:22:15 2024 +0800
  17. |
  18. |     更新内容
  19. |
  20. * commit 15026d4
  21. | Author: Seven <415849169@qq.com>
  22. | Date:   Tue Jul 9 00:16:23 2024 +0800
复制代码
  1. $ git checkout <file-name>a5d88ea# hash码很长,通常6-7位就够了
复制代码
  1. $ git push origin master --force
  2. # 或者 git push -f origin master
复制代码
  1. $ git rebase -i HEAD~4
  2. # 这个命令,将最近4个commit合并为1个,HEAD代表当前版本。将进入VIM界面,你可以修改提交信息。推送到远程分支的commit,不建议这样做,多人合作时,通常不建议修改历史。
复制代码
  1. $ git reset <file-name>--hard # 例如 git reset --hard a3hd73r# --hard代表抛弃工作区的修改,让工作区与版本代码一模一样,与之对应,--soft参数代表保留工作区的修改。
复制代码
  1. $ git reset <file-name>--hard HEAD^
复制代码
  1. $ git reset <file-name>--hard HEAD^^# HEAD^^可以换作具体版本hash值。
复制代码
  1. $ git reflog
  2. # 这个命令保留了最近执行的操作及所处的版本,每条命令前的hash值,则是对应版本的hash值。使用上述的git checkout 或者 git reset命令 则可以检出或回退到对应版本。
复制代码
  1. $ git commit --amend
复制代码
分支合并 merge

每个分支上都有各自独有的提交,这意味着没有一个分支包含了修改的所有内容。因此通过合并分支来办理这个问题。
git merge 用来做分支合并,将其他分支中的内容合并到当前分支中。比如分支结构如下:

其它分支合并到master分支

当前分支是master
  1. git checkout master
复制代码
把issueFix中的内容Merge进来:
  1. git merge issueFix
复制代码
如果没有冲突的话,merge完成。有冲突的话,git会提示那个文件中有冲突,比如有如下冲突:
  1. <<<<<<< HEAD:test.c
  2. printf (“test1″);
  3. =======
  4. printf (“test2″);
  5. \>>>>>>> issueFix:test.c
复制代码
可以看到 ======= 隔开的上半部分,是 HEAD(即 master 分支,在运行 merge 命令时检出的分支)中的内容,下半部分是在 issueFix 分支中的内容。
办理冲突的办法无非是二者选其一或者由你亲自整合到一起。比如你可以通过把这段内容替换为下面这样来办理:
  1. printf (“test2″);
复制代码
这个办理方案各接纳了两个分支中的一部分内容,而且删除了  这些行。在办理了所有文件里的所有冲突后,运行 git add <冲突文件>将把它们标记为已办理(resolved)。因为一旦暂存,就表现冲突已包办理。
合并后的分支图如下:

留意,这次合并的实现,由于当前 master 分支所指向的 commit (C4)并非想要并入分支(issueFix)的直接祖先,Git 不得不进行一些处理。就此例而言,Git 会用两个分支的末端(C4 和 C5)和它们的共同祖先(C2)进行一次简朴的三方合并。对三方合并的结果作一新的快照,并自动创建一个指向它的 commit(C6)
退出合并工具以后,Git 会询问你合并是否成功。如果答复是,它会为你把相关文件暂存起来,以表明状态为已办理。然后可以用 git commit 来完成这次合并提交。
因此,多人协作的工作模式通常是这样:
master分支合并到当前分支

以下是合并master分支到你的当前分支的基本步骤:
留意事项

Git代码管理规范

分支定名

master 分支

master 为主分支,也是用于部署生产情况的分支,需要确保master分支稳定性。master 分支一般由 release 以及 hotfix 分支合并,任何时间都不能直接修改代码。
develop 分支

develop 为开发情况分支,始终保持最新完成以及bug修复后的代码,用于前后端联调。一般开发的新功能时,feature分支都是基于develop分支创建的。
feature 分支

开发新功能时,以develop为底子创建feature分支。
分支定名时以 feature/ 开头,后面可以加上开发的功能模块, 定名示例:feature/user_module、feature/cart_module
test分支

test为测试情况分支,外部用户无法访问,专门给测试人员使用,版本相对稳定。
release分支

release 为预上线分支(预发布分支),UAT测试阶段使用。一般由 test 或 hotfix 分支合并,不建议直接在 release 分支上直接修改代码。
hotfix 分支

线上出现紧急问题时,需要及时修复,以master分支为基线,创建hotfix分支。修复完成后,需要合并到 master 分支和 develop 分支。
分支定名以hotfix/ 开头的为修复分支,它的定名规则与 feature 分支类似。
分支与情况对应关系

在系统开发过程中常用的情况:
对应关系:
分支功能情况可访问master主分支,稳定版本PRO是develop开发分支,最新版本DEV是feature开发分支,实现新特性否test测试分支,功能测试FAT是release预上线分支,发布新版本UAT是hotfix紧急修复分支,修复线上bug否分支合并流程规范

业界常见的两大主分支(master、develop)、三个辅助分支(feature、release、hotfix)的生命周期:

以上生命周期仅作参考,差别开发团队可能有差别的规范,可自行灵活定义。
Git Commit Message规范

Git commit message规范指提交代码时编写的规范注释,编写良好的Commit messages可以达到3个重要的目标:
Angular Git Commit Guidelines

业界应用的比较广泛的是Angular Git Commit Guidelines:
  1. <type>(<scope>): <subject>
  2. <BLANK LINE>
  3. <body>
  4. <BLANK LINE>
  5. <footer>
复制代码
简易版

项目中实际可以采用简易版规范:
  1. <type>(<scope>):<subject>
复制代码
type规范

Angular Git Commit Guidelines中保举的type范例如下:
除此之外,还有一些常用的范例:
单次提交留意事项

配置.gitignore文件

.gitignore是一份用于忽略不必提交的文件的列表,项目中可以根据实际需求统一.gitignore文件,减少不必要的文件提交和冲突,净化代码库情况。
通用文件示例:
  1. HELP.md
  2. target/
  3. !.mvn/wrapper/maven-wrapper.jar
  4. !**/src/main/**/target/
  5. !**/src/test/**/target/
  6. ### STS ###
  7. .apt_generated
  8. .classpath
  9. .factorypath
  10. .project
  11. .settings
  12. .springBeans
  13. .sts4-cache
  14. ### IntelliJ IDEA ###
  15. .idea
  16. *.iws
  17. *.iml
  18. *.ipr
  19. ### NetBeans ###
  20. /nbproject/private/
  21. /nbbuild/
  22. /dist/
  23. /nbdist/
  24. /.nb-gradle/
  25. build/
  26. !**/src/main/**/build/
  27. !**/src/test/**/build/
  28. ### VS Code ###
  29. .vscode/
  30. # Log file
  31. *.log
  32. /logs*
  33. # BlueJ files
  34. *.ctxt
  35. # Mobile Tools for Java (J2ME)
  36. .mtj.tmp/
  37. # Package Files #
  38. *.jar
  39. *.war
  40. *.ear
  41. *.zip
  42. *.tar.gz
  43. *.rar
  44. *.cmd
复制代码
其他

此外,还有一些其他建议:
学习书籍及网站


面试题专栏

Java面试题专栏已上线,接待访问。
那么可以私信我,我会尽我所能帮助你。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4