Git 库指令速查表
Git工作流程
首先是这张秦始皇都见过的图片
各个部分的功能
工作区
进行开发改动的地方,是你当前看到的,也是最新的。
平常我们开发就是拷贝远程仓库中的一个分支,基于该分支进行开发。在开发过程中就是对工作区的操作。
暂存区
暂存区只会记录添加文件的相关信息,不保存文件实体, 通过id指向每个文件实体。可以使用git status查看暂存区的状态。暂存区标记了你当前工作区中,哪些内容是被git管理的。
当你完成某个需求或功能后需要提交到远程仓库,那么第一步就是通过git add先提交到暂存区,被git管理。
本地仓库
保存了对象被提交过的各个版本,比起工作区和暂存区的内容,它要更旧一些。
git commit后同步index的目录树到本地仓库,方便从下一步通过git push同步本地仓库与远程仓库的同步。
远程仓库
远程仓库的内容可能被分布在多个地点的处于协作关系的本地仓库修改,因此它可能与本地仓库同步,也可能不同步,但是它的内容是最旧的。
小结
- 任何对象都是在工作区中诞生和被修改;
- 任何修改都是从进入暂存区才开始被版本控制;
- 只有把修改提交到本地仓库,该修改才能在仓库中留下痕迹;
- 与协作者分享本地的修改,可以把它们push到远程仓库来共享。
解决冲突
这可以算是协同工作中最重要的一环
首先冲突产生的前提是分支管理:
以下是分支管理相关指令
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name> 或者git switch <name>
创建+切换分支:git checkout -b <name> 或者git switch -c <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZLDmtEzf-1667458013183)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
当出现以上情况时,出现冲突的文件中会显示以下信息
<<<<<<< HEAD
HEAD分支中的内容
=======
feature分支中的内容
>>>>>>> feature
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bebCw70N-1667458013183)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
可以根据具体场景,重新修改好内容再将其与上述内容替换。当然合并后也别忘了删除feature分支
因此,多人协作的工作模式通常是这样:
- 首先,可以试图用
git push origin <branch-name> 推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull 试图合并; - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
git push origin <branch-name> 推送就能成功!
实际运用
对于本地分支的管理
git本地仓库中会看到你commit之后的提交记录和分支之间的关系图
对于这些繁多的分支,我们能通过 git cherry-pick '对应的提交号' 来选择对应的分支合并在当前指向的结点下
? 如果你不清楚你想要的提交记录的哈希值呢? 幸好 Git 帮你想到了这一点, 我们可以利用交互式的 rebase —— 如果你想从一系列的提交记录中找到想要的记录, 这就是最好的方法了 git rebase -i '重新分支的结点'
下图中,我们交换了C5 C4的顺序而且去掉了C2,这样的好处就在于我们能
撤销修改
- 如果我们修改错了某个文件,或者是弄乱了工程,想直接丢弃工作区的修改时,用命令
git checkout -- file 。 - 你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令
git reset HEAD <file> ,就回到了场景1,第二步按场景1操作 - 已经提交了不合适的修改到版本库时,想要撤销本次提交
git reset --hard HEAD^
git reset 通过把分支记录回退几个提交记录来实现撤销改动。原来指向的提交记录就跟从来没有提交过一样.虽然在你的本地分支中使用 git reset 很方便,但是这种“改写历史”的方法对大家一起使用的远程分支是无效的
为了撤销更改并分享给别人,我们需要使用 git revert 。因为新提交记录 C2' 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2' 的状态与 C1 是相同的。
远程仓库
远程分支反映了远程仓库(在你上次和它通信时)的状态。这会有助于你理解本地的工作与公共工作的差别 —— 这是你与别人分享工作成果前至关重要的一步.
远程分支有一个特别的属性,在你检出时自动进入分离 HEAD 状态。Git 这么做是出于不能直接在这些分支上进行操作的原因, 你必须在别的地方完成你的工作, (更新了远程分支之后)再用远程分享你的工作成果。
git checkout o/master git commit
正如你所见,Git 变成了分离 HEAD 状态,当添加新的提交时 o/main 也不会更新。这是因为 o/main 只有在远程仓库中相应的分支更新了以后才会更新。
Pull
git fetch 从远程仓库下载本地仓库中缺失的提交记录而且更新远程分支指针(如 origin/main ),但是并没有更新我们本地的指针(如:main),需要我们在执行因此 git merge 或者是 git rebase ,但是 git pull 帮我们完成了这两件事情
Push
git push 默认是推送到主分支,如果需要推送到指定远程仓库的分支,就需要 加上仓库和分支名字
对于Push和Pull都可以同时指定了提交记录的来源和去向
git push/pull <仓库名 remote> <source 数据输入来源>:<destination 数据输出的地方>
|