2

这是学习笔记,仅供自己学习所用。


Git简介

CVS和SVN都是集中式的版本控制系统;Git是分布式版本控制系统。

  • 集中式版本控制系统,版本库是集中存放在中央服务器的。集中式版本控制系统最大的毛病就是必须联网才能工作。
  • 分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库。不仅不必联网,还拥有极强的分支管理。

最早Git是在Linux上开发的,慢慢地有人把它移植到了Windows上。现在,Git可以在Linux、Unix、Mac和Windows这几大平台上正常运行了。

Git最基本的命令
本地操作
修改文件:

  • 初始化一个Git仓库,使用git init命令。
  • 添加文件到Git仓库,分两步:

    1. 使用命令git add <file>,可反复多次使用,添加多个文件; 
    2. 使用命令git commit -m <message>,完成。
    
  • git status可以随时掌握工作区的状态:有修改没有提交、(git add后)要提交的修改、(git commit后)没有需要提交的修改。
  • git status可以查看文件是否为修改过,用git diff(git add之前)可以查看修改内容。

版本回退:

  • HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
  • 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
  • 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

工作区和暂存区:
工作区就是你在电脑里能看到的目录;工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针HEAD。

clipboard.png
添加文件到Git仓库的两步,分别对应如下:
第一步用git add 把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步用git commit 提交更改,实际上就是把暂存区的所有内容提交到当前分支。
(这里有问题,因为git diff命令比较的是工作目录和暂存区快照之间的差异,按照上图的意思,git diff以后出现的应该是整个工作区的目录,而不仅仅已经被修改的文件,暂存区的概念还是有点问题的。emmm暂时也没找到最合理的解释,就只能先放一放。)

管理修改:
Git比其他版本控制系统设计得优秀,那是因为Git跟踪并管理的是修改,而非文件。

撤销修改:

  • 直接丢弃工作区的修改时,用命令git checkout -- file。
  • git add 之后,想要舍弃,分两步,第一步用git reset HEAD <file>,回到场景1,第二步按照上一个操作。
  • 已经提交了不合适的修改到版本库时,想要撤销本次提交,参考回退操作,前提是没有推送到远程库。

删除文件:
先手动删除文件(rm xxx),然后使用git rm <file>和git add <file>效果是一样的。
命令git rm用于删除以文件。
注:从来没有被添加版本库就被删除的文件,是无法恢复的!

远程仓库
emmm 先有远程仓库,后有本地库,就只需要git clone就好了;以下这个是先有本地库,后有远程库,最后进行关联远程库的操作。
要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git(例如:git@github.com:ZHEJIJI/learngit.git);
关联后,使用命令git push -u origin master第一次推动master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;
分布式版本系统的最大好处之一是再本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在米有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步。

分支管理:

  • 查看分支:git branch
  • 创建分支:git branch <name>
  • 切换分支:git checkout <name> 或者 git switch <name> (版本比较高的才能使用switch,版本低的没有这个命令。)
  • 创建+切换分支:git checkout -b <name> 或者 git switch -c <name>
  • 合并某分支到当前分支:git merge <name> (master上合并dev,需要在master上操作。)
  • 删除分支:git branch -d <name>

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
用 git log --graph 命令可以看到分支合并图。

Bug分支:
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;
在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。

Feature分支:
要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除(git branch -d <name>会友情提示,分支还没有被合并,如果删除,将丢失修改;要强行删除,需要使用大写的-D参数)。

多个分支:

  • 查看远程库信息,使用git remote -v;
  • 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
  • 从本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch,本地和远程分支的名称最好一致;
  • 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
  • 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

标签管理:

  • 命令git tag <tagname >用于新建一个标签,默认为HEAD,也可以指定一个commit id;
  • 命令git tag -a <tagname> -m "balabala" xxxx 可以指定标签信息;
  • 命令git tag 可以查看所有标签。
  • 命令git push origin <tagname> 可以推送一个本地标签;
  • 命令git push origin --tags 可以推送全部未推送过的本地标签;
  • 命令git tag -d <tagname> 可以删除一个本地标签;
  • 命令git push origin :refs/tags/<tagname> 可以删除一个远程标签。

自定义Git
忽略特殊文件:

  • 忽略某些文件,需要编写.gitignore;
  • .gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!

喆喆
74 声望7 粉丝

小白一枚!!!