可以直接看实践
总结自施磊老师课程
Git与SVN对比
svn操作流程
-
写代码。
-
从服务器拉回服务器的当前版本库,并解决服务器版本库与本地代码的冲突。
-
将本地代码提交到服务器。
Git操作流程
-
写代码, 然后添加(add)到暂存区。
-
提交(commit)到本地版本库。
-
从服务器拉取(pull)服务器的当前版本库,并解决服务器版本库与本地代码的冲突。
-
将远程库与本地代码合并结果提交(commit)到本地版本库。
-
将本地版本库推送(push)到服务器
注意:推送代码前一定要拉代码,不然把别人代码冲没了,还要花时间找
对比可以看出:分布式版本管理仅仅是增加了本地库这个概念,其余的概念与集中管理并无区别。——但是 svn 在与服务器同步之前无法提交代码,因而本地修改更容易出问题。
Git常用命令
正常流程基本命令
git clone -b master git@github.com:luzhenren/GitLearn.git
将远程仓库指定分支克隆到本地
会自动创建远程仓库名称origin 和 本地仓库
-
git branch
查看分支
-
git status
查看哪些代码变化
-
总流程如下
-
git add <要提交的代码>
将工作区代码提交到了暂存区
-
git commit -m "feat: 初始化提交代码"
将暂存区代码提交到本地仓库
-
git pull origin <分支名>
拉取远程仓库代码,合并代码
如果有冲突,则需要重新处理代码,使其能够编译过,此时处理过后的代码又是新代码,需要再一次 add commit pull。
确认本地仓库代码一定是最新的了再push,不然会导致别人代码被冲掉。
-
git push origin <本地仓库分支>:<远程仓库分支>
仓库分支名一致,则可以
git push origin <分支名>
将本地仓库推送到远程仓库
重要!!!
**提交之前一定要确定代码编译没问题提交之前一定要确定代码编译没问题
提交之前一定要确定代码编译没问题**
异常流程版本回退命令
-
未使用
git add
的时候----在工作区git checkout -- <filepathname> # 放弃修改某个文件 例如: git checkout -- readme.md git checkout . # 放弃所有修改的文件 git restore . # 放弃所有修改的文件
-
已经使用
git add
的时候----在暂存区git reset HEAD <filepathname> # 恢复某个文件到工作区 例如: git reset HEAD readme.md git reset HEAD . # 恢复所有文件到工作区 git reset # 恢复所有文件到工作区
注意:这里只是恢复到了工作区,如果想放弃修改的代码还需要执行上述(放弃工作区)中的操作
-
已经使用
git commit
提交的了代码----在本地仓库git log
查看本地仓库提交记录,记录会带有每次提交的版本号(commit id)git reset --hard <commit id>
退到暂存区 -
已经
git push
到了远程分支----在远程仓库git push -f origin <分支名>
确认只有自己更新了,先回退本地仓库,然后强制更新(本地落后于远程只能强制)远程仓库即可
(如果此期间别人提交了代码,需要协商处理,所以意识到问题后立即告知大家)
代码冲突处理
冲突发生在两个人操作同一个文件的时候
gut pull后文件就会变成如下
<<<<<<<<<<<<<<<<<< HEAD (当前更改)
我的代码
=====================
你的代码
>>>>>>>>>>>>>>>>>>>>>> dsfahowihowqerhqoir2143 (传入更改)
就是看采用你的代码还是我的代码、或者两个人的都要一部分(沟通!!!)
Git分支管理
总结:对于开发,本地分支数与远程分支数一一对应,可以避免很多问题,开发很可靠
本地分支管理
git本地创建多个分支,互不干扰。
情景:在做某个需求a时,先需要修改紧急bug b;发版时发的是远程dev的代码。
方式一(推荐):
(1)本地已有分支dev,写了需求a,先commit,即将工作区的内容提交到版本库中,否则切换到其他分支时,就会覆盖当前工作区的代码。(这步很重要)
(2)在本地创建dev_bug分支,从远程dev分支中check(git checkout -b dev_bug origin/dev)
(3)在本地dev_bug上修改bug,并commit、push到远程dev上
(4)在本地变换到dev,继续做需求a
为了开发新功能不影响master稳定的代码,创建一个新分支来开发
19393@LAPTOP-L9L4QE0T MINGW64 /d/code/github/GitLearn (master)
$ git checkout -b sortdev
Switched to a new branch 'sortdev'19393@LAPTOP-L9L4QE0T MINGW64 /d/code/github/GitLearn (sortdev)
$ git branchmaster
* sortdev
git checkout -b sortdev
创建并切换分支sortdev,我在这个分支开发排序功能
使用git pull origin master 指定此分支的远程仓库,并拉取代码
开发完成后,发现推送不成功
解决方案:
将sortdev分支,合并到master分支
git checkout master
git merge sortdev
PS D:\code\github\GitLearn> git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
PS D:\code\github\GitLearn> git merge sortdev
Updating 4e9ad19..db08cf8
Fast-forwardmain.cpp | 13 +++++++++++++1 file changed, 13 insertions(+)
继续推送
PS D:\code\github\GitLearn> git push origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 16 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 510 bytes | 510.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:luzhenren/GitLearn.git4e9ad19..db08cf8 master -> master
合并分支后,删除原有分支
PS D:\code\github\GitLearn> git branch -d sortdev
Deleted branch sortdev (was db08cf8).
PS D:\code\github\GitLearn> git branch
* master
合并分支冲突
1. 确保工作目录干净
在合并分支之前,确保当前分支的工作目录是干净的(没有未提交的更改),以免产生额外的合并问题。你可以使用以下命令查看当前工作目录状态:
git status
2. 切换到 master
分支(或目标分支)
切换到你希望合并到的目标分支(通常是 master
):
git checkout master
3. 合并 dev
分支到 master
分支
使用以下命令将 dev
分支合并到 master
分支中:
git merge dev
如果 dev
和 master
分支有冲突,Git 会提示你冲突的文件和位置。
4. 解决冲突
编辑冲突的文件,手动解决冲突部分。冲突的代码块通常格式如下:
<<<<<<< HEAD
内容来自当前分支(master)
=======
内容来自合并分支(dev)
>>>>>>> dev
你需要根据实际情况,决定保留哪一部分,或者手动合并它们的内容。修改后的文件可能是这样:
合并后的最终代码内容
完成每个冲突文件的修改后,保存文件并退出编辑器。
5. 标记冲突已解决并提交
解决所有冲突后,执行以下命令将修改添加到暂存区(staging area):
git add <冲突文件1> <冲突文件2> ...
然后提交解决冲突后的更改:
git commit -m "解决 dev 与 master 的冲突"
6. 继续合并或推送
完成合并后,你可以将 master
分支推送到远程仓库:
git push origin master
远程分支管理
版本迭代结束后开启新迭代时,需要新开一个分支作为新版本开发分支
一般做法:我本地也创建一个新分支,追踪远程的新分支
PS D:\code\github\GitLearn> git checkout -b dev origin/dev1.01.00
Switched to a new branch 'dev'
branch 'dev' set up to track 'origin/dev1.01.00'.
指定了远程仓库后,以后git pull和push就不用使用origin指定远程仓库了
可以看到追踪关系很明确
如果创建分支时没有设置追踪的远程仓库分支,使用git branch -u <远程仓库名>/<远程分支名>
补救
Tag处理
如何使用Git将标签推送到远程仓库|极客笔记
Git工作流实践(!!!)
项目代码远程仓库分支:
- master主分支
- dev开发分支
- release:发布分支
个人开发分支
- feature特性分支
- bugfix缺陷修改分支
- hotfix热更新分支
开发阶段流程总结
- 创建个人本地开发分支:
git checkout -b feature/add_new_line origin/dev
- 个人本地分支推送到远程分支:
git push origin feature/add_new_line:feature/add_new_line
- 提交个人远程代码分支和目标代码合入分支的MR,相关负责人进行CR
- 相关负责人提出意见,本地修改相应的代码,推送到对应的远程代码分支上
- 代码CR意见处理完,相关负责人进行代码merge,代码修改从feature/add_new_line合入dev分支完成
- 删除个人远程代码分支
bug回归阶段操作同上