Git三大核心问题总说:版本、分支与远程

关于Git

重要的且绝对优质的学习资源

廖雪峰的官方网站:Git教程
Git Pro Book
Git官方文档

Git核心思想

  • 版本控制(SVN也有)
  • 低成本分支:通过移动指针实现
  • 本地-远程的分布式:不把鸡蛋放在一个篮子里
  • 应用思想:殊途同归是Git哲学。

修改与版本回退

详见git checkout/git reset/git revert/git restore常用回退操作

在Git中,commit、版本和HEAD之间有着密切联系。commit即是版本,HEAD为(当前所在的)commit的引用。详见HEAD相关的Git时间线结构基本概念总结

跳出修改(checkout)

检出当前修改,这里用于消除工作树改动(工作树就是本地文件夹)

使用格式

git checkout -- <file_name>

注意文件名称之前有个空格。只能消除改动,不能消除untracked文件。消除untracked文件需要使用clean指令

  • 如果没有stage,就撤销工作区的changes

    也可以使用git restore --worktree <filename>git restore -W <filename>

  • 如果已经stage,撤销这次stage

重设版本(reset)

重设HEAD指针,用于版本的回退。

# (对某branch)
git reset <version>  <filename>`
  • version多用HEAD指针表达,也可以直接用版本号

  • HEAD对应取消unstage,HEAD^为回退一版,HEAD~n为回退n版

    unstage还可以使用git restore --staged <filename>或者git restore -S <filename>。回退到特定版本可以直接加版本号。

  • 默认为fixed模式,回退的改动返回工作树(unstaged changes)。

放弃(restore)

意为重置,推翻先前。restore的两类用法可以被checkout和reset解决,分别为撤销工作区改动和版本回滚,在前面已经说过。但对于discard changes、unstage,restore的语法可以非常简明:

git restore <filename>

详见https://www.jianshu.com/p/dcef204dba74

复盘(revert)

意为再来一遍。以前的记录不会抹掉。把某个指定版本续在变化时间线后面。

分支操作:Git的灵魂

这是Git最巧妙的设计。简单如下几步(图见HEAD、master 与 branch):

  1. 创建分支在这里插入图片描述

  2. 平等、隔离地开发

在这里插入图片描述

  1. 合并分支在这里插入图片描述

增、改、合的主要语法

详见易百教程
查看分支:

git branch

创建分支:

git checkout -b <branch-name> # 创建+切换
git branch <branch-name>

切换分支:

git checkout <branch-name>
git switch <branch-name>
git switch -c <branch-name> # 创建+切换

合并分支:
:合并分支branch1到当前分支:

git merge branch1

解决冲突

两种常见的冲突。

第一种:管理版本之间的冲突:

git diff <filename>

使用diff命令之后,会在原文件中出现

<<<<<<<<<<<<<<<<<<<<<<<<<<
==========================
>>>>>>>>>>>>>>>>>>>>>>>>>>

分隔开的两段代码,将它们手动汇成一段即可。

在远程协作中还有一个冲突的情况,即将一个空库和本地库建立关系的时候,对pull使用--rebase参数,即可将它们汇成合规的commit时间线。

远程协作

remote端也有类似于本地的一个HEAD指针,名为FETCH_HEAD,相关问题详见https://www.cnblogs.com/Venom/p/5477367.html

关联远程库

关联方法

git clone <url>
# 或
git remote add [库名]

取消关联:

git remote rm origin

库名默认为origin,若要进行Gitee备份,可以将其同GitHub的关联先删掉,然后重新定名为github。

推送改动(push)

远程操作的最基础语句:利用本地改变远程。个人使用时(分支保证up-to-date)常用。

语法:

git push [主机名] [本地分支]:[远程分支]

示例情形

  • 创建远程分支master:git push origin master

  • 删除远程分支master:git push origin :master(把一个空分支推到指定的分支origin/master)

    origin表示主机名,以上两句的推送始末分别对应于master:master[null]:master

  • 建立local-remote追踪:git push -u origin master,或git branch --set-upstream master origin/next

  • 有追踪关系的推送更新:git push origin(省略分支名,默认为当前所在分支和远程对应分支)

  • 仅有一个追踪分支:git push

通常远程库会比本地的新,所以可能无法正常完成push,所以要先pull再push。

远程拉取(pull)

指令相关详见https://www.yiibai.com/git/git_pull.html

从remote取回(fetch)且汇入本地(merge)处理not-up-to-date问题。
相当于如下三条语句的过程:

git fetch origin master:tmp
git diff tmp 
git merge tmp

其语句结构和push一样。

如果创建新仓库的过程出现不相关拒绝merge的情况,如下:

fatal: refusing to merge unrelated histories

则对其rebase,消除版本变化过程中的环

git pull --rebase origin master

参考文档

(侵权请联系删除)

廖雪峰的Git教程
Git官网文档
git checkout/git reset/git revert/git restore常用回退操作
HEAD、master 与 branch
GIT撤销修改 restore

易百教程:
git branch命令
git pull命令

git fetch, git pull 以及 FETCH_HEAD
简单对比git pull和git pull --rebase的使用
Git submodule实战
删除git库中untracked files(未监控)的文件

链接列表

https://www.liaoxuefeng.com/wiki/896043488029600
https://git-scm.com/doc
https://blog.csdn.net/albertsh/article/details/104719370
https://www.jianshu.com/p/4219b6f62ce3
https://www.jianshu.com/p/dcef204dba74
https://www.yiibai.com/git/git_branch.html
https://www.yiibai.com/git/git_pull.html
https://www.cnblogs.com/Venom/p/5477367.html
https://www.cnblogs.com/kevingrace/p/5896706.html
http://blog.jqian.net/post/git-submodule.html
https://blog.csdn.net/ronnyjiang/article/details/53507306

猜你喜欢

转载自blog.csdn.net/weixin_45502929/article/details/108632641