-
2.Git\
-
Git 简介\
- Git是分布式版本控制系统,创始是Linux的作者\
-
Git 的工作区域和流程·\
-
工作区域\
- Workspace(工作区)就是平时进行开发改动的地方,当前看到最新的内容\
- Index(暂存区)当执行 git add 的命令后,工作区的文件就会被移入暂存区,暂存区标记了当前工作区中那些内容是被 Git 管理的\
- Repository(本地仓库)位于自己的电脑上,通过 git commit 提交暂存区的内容,会进入本地仓库\
- Remote(远程仓库)用来托管代码的服务器,通过 git push 命令同步代码到远程仓库\
-
流程\
- 1.在工作区开发,添加,修改文件。\
- 2.将修改后的文件放入暂存区。\
- 3.将暂存区域的文件提交到本地仓库。\
- 4.将本地仓库的修改推送到远程仓库。\
-
-
Git 基本操作(add、commit、pull、fetch、branch)\
-
git add(添加文件到暂存区)\
- git add .提交所有\
-
git commit(提交暂存的更改)\
- git commit -m "you message"记录下备注\
-
git pull(从远程仓库拉取代码并合并到本地)\
- git pull <远程主机名> <远程分支名>:<本地分支名>(等同于 git fetch && git merge)\
- git pull --rebase <远程主机名> <远程分支名>:<本地分支名>(使用rebase的模式进行合并)\
-
git fetch(获取远程仓库特定分支的更新)拉代码\
- git fetch <远程主机名> <分支名>\
- git fetch --all(获取远程仓库所有分支的更新)\
- 与 git pull 不同的是 git fetch 操作仅仅只会拉取远程的更改,不会自动进行 merge 操作。对你当前的代码没有影响\
-
git branch(查看本地分支)\
- git branch -r(查看远程分支)\
- git branch -a(查看本地和远程分支)\
- git branch -D (删除本地分支)\
- git branch -m (重新命名分支)\
-
-
Git 命令总结\
- git status——不知道该干嘛,就用它\
- git init——初始化一个git仓库\
- git add——修改加入暂存区\
-
git diff——查看不同(暂存区和工作区的差异)\
- git diff --cached(本地仓库和暂存区的差异)\
- git commit——本地提交\
- git log——commit历史记录\
-
git rm——git删除\
- 简化了删除,删除不经过暂存区,不用add直接commit\
- 减少了暂存区的操作,可以在本地删除,同时也在git的版本库中删除\
-
git mv——git移动\
- 减少了暂存区的操作,可以在本地重命名,同时也在git的版本库中重命名、移动\
- git pull——拉取远程仓库\
- git push——推送到远程仓库\
-
Git 远程仓库\
-
远程与本地\
- git clone\
- git pull\
- git push\
- 多个远程仓库\
- GitHub开启协作\
-
-
为什么要用 git pull --rebase?\
-
原理\
- git pull === git fetch + git merge\
- git pull --rebase === git fetch + git rebase\
-
区别\
- merge(会生成一个新的节点,之前的提交分开显示)\
- rebase(操作不会生成新的节点,是将两个分支融合成一个线性的提交)\
-
小技巧:别名\
- git config --global alias.pull 'get pull --rebase'(直接覆盖原有的pull)\
- git config --global alias.pr 'get pull --rebase'(保留原有的pull,用 pr 标识)\
-
-
Git branch & tag\
-
branch(迭代用)\
- git branch(列出本地所有分支)\
- git branch test(新建分支test)\
- git checkout -b test(新建并切换)\
- git checkout test(切换到test)\
- git branch -b(删除分支)\
- git push(推送分支到远程)\
-
合并分支\
- git merge\
- git rebase\
- 代码合并冲突解决\
-
tag(交付用)(常见的tag都是用来标记一个确定的release版本的)\
- git tag(列出所有tag)\
- git tag v1.0(打tag)\
- git tag v1.1 f52c633(基于commit -id 打tag)\
- git show v1.1(列出tag信息)\
- git tag -a v1.2 -m "msg" 1094adb(指定commit -id,msg打tag)\
-
branch 对比 tag\
-
修改\
- 要修改(Branch)\
- 不修改(Tag)\
-
目的\
- 面向交付(Tag)\
- 面向迭代(Branch)\
-
本质\
- Tag(对单个commit快照)\
- Branch(N个commit的合集)\
-
-
-
***工作中使用 Git 解决问题的场景(rebase变基)\
-
***git rebase(变基)\
- 作用:git rebase 让你的提交记录更加清晰可读\
-
使用rebase\
- rebase 翻译为变基,他的作用和 merge 很相似,用于把一个分支的修改合并到当前分支上\
- 大部分情况下,rebase 的过程中会产生冲突的,此时,就需要手动解决冲突,然后使用依次 git add 、git rebase --continue 的方式来处理冲突,完成 rebase 的过程,如果不想要某次 rebase 的结果,那么需要使用 git rebase --skip 来跳过这次 rebase 操作。\
-
git merge 和 git rebase 的区别\
-
总结\
- 两者功能一样都是合并代码,但rebase形成的git提交历史记录简洁易懂\
- 在解决冲突的时候,用 merge 只需要解决一次冲突即可\
- git merge 在不是 fast-forward(快速合并)的情况下,会产生一条额外的合并记录\
-
git merge\
- 把分支和主线的代码合并,并且形成一个新的提交\
- 你建立分支的记录也会在最终git提交历史上有一个明显的展现\
-
git rebase\
- 相当于把分支变基到主线,让整个提交非常笔直,只有一条线路\
-
-
工作中的实际情况\
-
①实际情况演示:\
- 假如我们得知旧的主分支发生改变,我们重新git pull,但是与我们原本开发feature1新分支前的旧的主分支状态不同(如文件和依赖和测试)。那我们需要怎么让新的主分支同步到我们旧的主分支分出的feature1新分支里?\
- 注意:不要用git merge合并分支代码\
-
②此时体现了git rebase(变基)的用法\
- git rebase master(把当前feature1的分支,重新变基到最新的master主分支上)\
- ③feature1开发完毕后,严格测试后。把feature1的功能同步到master上去\
-
-
-
日常开发流程\
- 1.同步线上仓库remote master的代码,到本地仓库local master\
- 2.接到需求完成feature1分支,在feature1上面我去做了相应的一些提交\
- 3.然后我得到了组长的通知,线上的remote master有人提交了代码\
- 4.我在本地需要把分支切换回master,做git pull操作去同步线上的更新\
- 5.代码更新完毕后,我切换回feature1分支用git rebase master,把当前的feature1切换到最新的master上去\
- 6.再对feature1做一个全量的测试,测试完毕后,把分支切换回master\
- 7.进行git rebase feature1操作,把master和feature1做了一个合并\
- 8.合并完成后,把本地的代码推到线上去,让线下和线上做一个同步\
-
Git stash\
-
应用场景\
- 有部分代码是多余的,想保留以后查看,但是又不想提交到远程分支\
- 在进行多分支开发时,比如你在A分支上开发,但是突然发现B分支上有个bug需要修复,以前往往会把A分支上开发一半的功能本地commit,切换到B分支修复bug,然后再切换回A分支继续开发,这样往往log上会有大量不必要的记录。现在可以使用git stash将你当前未提交到本地(和服务器)的代码推入到Git的栈中,放心切换到B分支修复代码,完事儿后切换回A分支使用git stash apply将以前一半的工作应用回来\
-
基本命令\
-
保存当前代码\
- git stash: 快速储藏代码,默认储藏名称为"WIP on <branch_name>\
- git stash save "message": 执行储藏时,添加message信息,注明储藏名称,方便查找\
-
查看stash代码\
- git stash list: 查看stash列表\
- git stash show: 查看第一个储藏做了哪些改动(并不是改动详情)\
- git stash show stash@{num}: 查看其他储藏做了哪些改动\
- git stash show -p: 查看第一个储藏的改动\
- git stash show -p stash@{num}: 查看其他储藏做的改动\
-
应用stash代码\
- git stash apply: 应用第一个储藏,但不会删除\
- git stash apply stash@{num}: 应用列表中的储藏\
- git stash pop: 应用第一个储藏并删除\
- git stash pop stash@{num}: 应用stash list中的储藏并删除,例如应用并删除第二个:git stash pop stash@{1}\
-
删除stash代码\
- git stash drop: 删除以一个储藏\
- git stash drop stash@{num}: 删除stash list中的储藏,例如删除第二个:git stash drop stash@{1}\
- git stash clear: 删除所有储藏的stash\
-
以stash储藏创建一个分支\
- git stash branch branchName stash@{1}: 创建新分支branchName,并切换到此分支,分支的状态与stash储藏时的状态一致,此时新分支应用的stash代码进了暂存区。\
-
-
-
总结:\
- git init 初始化git生成git仓库\
- git status 查看git状态\
- git add 添文件到暂存区\
- git add .加入所有文件到暂存区\
- git commit -m 'message'提交文件到本地仓库\
- git reset 将尚没有commit之前加入到暂存区的文件重新拉回\
- 文件状态:\
- 1.没有被add过的文件叫untracked\
- 2.add之后文件处于staged状态等待commite\
- 3.commit之后文件处于unmodified这里之所以是modified是因为文件会跟仓库中的文件对比\
- 4.当unmodified的文件被修改则会变为modified状态\
- 5.modified之后的文件add之后将继续变为staged状态\
- 6.unmodifed的文件还有一种可能是已经不再需要了,那么可以remove它不再追踪变为untracked状态\
-