Git复习

1. 引言

现在要用到Git,复习一下关于Git的指令,知识摘自《Pro Git》

2. 起步

git和其他版本控制软件最大的差别在于git是直接记录某个版本的快照,而不是逐渐地比较差异。
Git复习_第1张图片

Git复习_第2张图片

  • 安装: sudo apt install git-all
  • 设置用户信息:
git config --global user.name "John Doe"
git config --global user.email [email protected]
  • 配置vim为默认文本编辑器:git config --global core.editor emacs
  • 查看配置情况:git config --list
  • 查看某个命令的帮助-h eg:git add -h

3. Git基础

1. 初始化:git init,跟踪 git add,取消跟踪git rm cached

git add是一个多功能命令,用于开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。
Git复习_第3张图片
b之前已被add,但是我又修改了一下,暂存区是之前add之后的,修改后但还没add的在工作区,不在暂存区,现在commit的话会提交add时的b的版本。
git status -s是简短的status的输出:
在这里插入图片描述
??表示新添加未跟踪的文件
A表示在暂存区
M表示修改过
D表示删除了

对某个文件取消跟踪
git rm --cached readme1.txt 删除readme1.txt的跟踪,并保留在本地。
git rm --f readme1.txt 删除readme1.txt的跟踪,并且删除本地文件。

2. 关于改动

看工作区内有哪些改动:git diff
看暂存区内哪些改动:git diff --staged
Git复习_第4张图片

Git复习_第5张图片

3. 删除

如果要删除一个已经被track的文件c.txt,首先从磁盘上删除rm c.txt,然后执行git rm c.txt从git中将其删除。
Git复习_第6张图片

如果已经track了一个你不想track的文件d.txt,但是又不想从磁盘上删除,则使用git rm --cached README

4. 移动文件

git mv file_from file_to 在linux下就是重命名,git能检测到是改名
Git复习_第7张图片
其实就相当于三条指令:

mv a.txt  A.txt
git rm a.txt
git add A.txt

5. 查看提交历史

git log
git log -2查看最近的两次提交
显示每次提交所引入的2条差异:git log -p -2

6. 撤销操作

如果上次提交操作有一些纰漏(如忘记添加某个文件),但是又不想弄乱提交记录,就可以使用git commit --amend -m ,来替换上次的提交而不会再多一次提交记录。

git reset HEAD b.txt可以用于取消对b.txt文件的暂存。
Git复习_第8张图片
使用git reset –hard 还原到某一次提交
git reset --hard commit ID

git reset --hard commit ID

git 2.25.1中取消暂存是git restore --staged a.txt,把a.txt取消暂存
git restore a.txt就取消对a.txt文件的保存。

7. 远程仓库

git remote
git remote -v 显示远程仓库的简写和URL
在这里插入图片描述
新添一个远程仓库。
Git复习_第9张图片

  1. 添加一个新的远程 Git 仓库,同时指定一个方便使用的简写pb
git remote add pb https://github.com/paulboone/ticgit
  1. 拉取仓库中有,但是我本地没有的信息:
git fetch pb

访问远程仓库,从中拉取我还没有的数据,完成后,我会拥有那个远程仓库中所有分支的引用。

git clone之后远程仓库默认为origin,git fetch origin会抓取clonepush的所有工作,git fetch只会将数据下载到本地仓库,并不会merge,如有需要,需要手动mergegit clone会自动设置本地master分支跟踪克隆仓库的master分支(或其他名字的默认分支),git pull origin通常会抓取服务器上的数据并尝试合并到当前所在的分支。

git push origin master将本地的项目推送至origin服务器,如果在推送之前有人又推送过了,必须先fetch后再push

  1. 远程仓库的重命名
git remote rename pb paul

修改远程仓库pb名称为paul,注意这个操作同时也会修改所有远程分支的名字。

  1. 删除远程仓库
git remote remove paul

一旦删除,所有和这个远程仓库相关的远程跟踪分支以及配置信息都会一起被删除。

8. 标签

用途:用于给某个提交打标签,以示重要,典型的如发布时打上版本号。

分为轻量标签(lightweight)和附注标签(annotated)
轻量标签是某个特定提交的引用;
附注标签是一个对象,存储了annotater的名字、邮箱、日期、标签信息。
建议使用附注标签(含信息多)

打了标签的效果如下所示:
Git复习_第10张图片

9. 共享标签(把本地标签推送到远程服务器上)

默认情况下git push 并不会传送标签到远程仓库服务器上,创建完标签后必须显式推送到服务器上。

git push origin v1.5

删除服务器上的标签:

git push origin --delete <tagname>

也可以本地删除之后push上去

git tag -d v1.4-lw
git push origin :refs/tags/v1.4-lw

10. Git别名

没什么大用,配置如下例:

git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status

4. Git分支

1. 分支创建

创建一个testing分支:

 git branch testing

2. 分支切换

git checkout testing

创建一个新的分支并切换过去:

 git checkout -b <newbranchname>

3. 查看分叉历史

 git log --oneline --decorate --graph --all

Git复习_第11张图片

4. 分支的合并 git merge to_be_merged_branch

把develop分支合并到master分支:

git checkout master
git merge develop

这里之前一直有些混乱,现在好好捋一捋:
《Progit》上面的一个案例:
master上工作到iss53时来了个电话要修复master上的bug,切换到master分支,再切一个新分支hotfix来修复bug:
Git复习_第12张图片
修复完之后把hotfix分支merge到master上:

git checkout master
git merge hotfix

就成了下面这样:
Git复习_第13张图片
此时hotfix分支不需要了,直接删除:

git branch -D hotfix

变成下面这样
Git复习_第14张图片

然后需要继续回到iss53分支继续来电话之前我正在做的分支,iss53分支任务完成之后,需要把iss53分支合并到master分支上,但是他们不是共同的祖先分支,master的祖先是C2,iss53的祖先是C3

git checkout master
git merge iss53

git log --oneline --decorate --graph --all查看
Git复习_第15张图片

合并完之后是这样:
Git复习_第16张图片

此时不再需要iss53分支了,遂删除:

git branch -D iss53

特殊地:当相同的文件在不同的分支被修改,在merge时会产生conflit,此时的merge会先暂停,等待你把这部分conflit解决(到底决定保留哪种更改)之后再merge:
Git复习_第17张图片
Git复习_第18张图片
上图中在master分支和iss53分支都修改了index.html文件,======上侧的代表在HEAD所指的版本(此时HEAD所指master,所以上侧代表master内的修改),==下侧代表iss53内对index.html的修改,为了解决冲突,你必须选择有=分割的两部分中的一个。

5. rsync的使用

參考博客
常用指令:
push,把本地1/文件夹下的数据推送到远程的oem/param/文件夹下

rsync -a -zz --progress 1/ [email protected]:oem/param/

pull,把远程的oem/param/文件夹下的文件拉到本地的此处./

rsync -a -zz --progress [email protected]:oem/param/ ./

6. 关于smartgit的cherry pick

cherry pick是选择另一个分支的一个提交来提交到目标分支上,但是如果遇到conflict需要手动解决才能commit。参考博客
Git复习_第19张图片

7. git更改远程分支名字

参考博客
Git复习_第20张图片

你可能感兴趣的:(Git,git,github)