Git使用笔记

Git教程传送门 -> https://www.liaoxuefeng.com/wiki/896043488029600/896067074338496

1.Git简介

Git是目前世界上最先进的分布式版本控制系统
分支管理

集中式版本控制系统需要联网工作,局域网带宽够还好,如果遇到互联网网速慢的情况提交慢。
eg:CVS、SVN、ClearCase

分布式版本控制系统没有“中央服务器”,每个人电脑上都有一个完整的版本库,安全不易丢失数据
分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
eg:Git、BitKeeper、Mercurial、Bazaar

1.1 安装Git

Linux环境安装Git
Debian/Ubuntu => sudo apt-get install git
其它Linux版本 => 通过源码安装(Git官网下载源码 -> 解压 -> 依次输入: ./config, make, sudo make install)

安装完成后,还需要最后一步设置,在命令行输入:

$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"

因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。
注意: git config命令用了--global参数,表示你这台机器上所有的Git仓库都会使用这个配置。

1.2 创建版本库

版本库又名仓库(repository),可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的创建、修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

说明:所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。如果要真正使用版本控制系统,就要以纯文本方式编写文件。
图片、视频、Word格式文档是二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,修改了什么内容版本控制系统不知道。

@创建版本库
1.选择一个合适的地方,创建一个空目录:
$ mkdir learngit

2.初始化Git仓库:
$ cd learngit
$ git init

说明:当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,不要手动修改这个目录里面的文件。

@添加文件到Git仓库
使用命令git add <file>,注意,可反复多次使用,添加多个文件;
使用命令git commit -m <message>,完成。

2.时光穿梭机

@git status命令和git diff命令
使用git status命令随时掌握工作区的状态。
使用git diff可以查看修改内容。

2.1 版本回退

HEAD指向的版本就是当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,往上100个版本可以写成HEAD~100。

因此,Git允许我们在版本的历史之间穿梭,

@git reset命令
使用git reset --hard HEAD^ 回退到上一个版本 
使用git reset --hard <commit_id> 回退到指定版本(版本号写前几位就行)

@git log命令
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。

@git reflog命令
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

2.2 工作区和暂存区 & 2.3管理修改

工作区(Working Directory)
就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区。

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

把文件往Git版本库里添加分两步执行:
git add添加文件 => 把文件修改添加到暂存区(工作区 -> 暂存区);
git commit提交更改 => 把暂存区的所有内容提交到当前分支(暂存区 -> master分支)。

2.4 撤销修改

@丢弃工作区修改
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
这个命令会用版本库里的版本替换工作区的版本。

@丢弃暂存区修改
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步:
第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。

@分支回退
场景3:已经提交了不合适的修改到版本库时(未推送到远程库),想要撤销本次提交,用命令 git reset --hard HEAD^。

2.5 删除文件

@git rm命令
工作区删除文件 rm test.txt => 如果是手误,使用 git checkout -- test.txt 恢复
将修改添加到暂存区 git add test.txt 或者使用 git rm test.txt
提交至分支 git commit -m "test.txt"

3.远程仓库

前提:登录Github,添加SSH Key

3.1 添加远程库

场景:已在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步。这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作

step1 Github上创建新仓库
首先,登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库;
在Repository name填入learngit,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库(此时,在GitHub上的这个learngit仓库还是空的)

step2 本地仓库与Github上的仓库关联
@关联远程仓库
在本地的learngit仓库,使用命令 git remote add origin git@server-name:path/repo-name.git,例如
$ git remote add origin [email protected]:<GitHub账户名>/learngit.git
添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。

@第一次推送master分支的所有内容
$ git push -u origin master
加上参数-u,会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

@(非首次)提交推送最新修改
$ git push origin master
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

3.2 从远程库克隆

准备好一个远程库,例如gitskills.git
@git clone克隆仓库
本地文件路径执行如下命令
$ git clone [email protected]:<GitHub账户名>/gitskills.git

Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。

4 分支管理

4.1 创建与合并分支

HEAD指向主分支/master分支,master指向提交。每次提交,master分支都会向前移动一步。
创建分支 => 创建新指针dev,HEAD改为指向这个新指针
合并分支 => 把master指向dev的当前提交
删除分支 => 删除指针dev

@创建、切换到新分支
创建dev分支,然后切换到dev分支:
$ git checkout -b dev
-b参数表示创建并切换,相当于以下两条命令:

$ git branch dev
$ git checkout dev

或者用如下新命令
$ git switch -c dev

@查看当前分支
$ git branch
* dev
  master
git branch命令会列出所有分支,当前分支前面会标一个*号。

@切换分支
切换到master
$ git checkout master

或者用如下新命令
$ git switch master

@合并分支
合并dev的改动至master
$ git merge dev
git merge命令用于合并指定分支到当前分支。

@删除分支
删除dev分支
$ git branch -d dev

4.2 解决冲突

场景:两个分支分叉,不在一条线,且指向的提交内容有冲突
当Git无法自动合并分支时,就必须首先解决冲突。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
@用git log --graph命令查看分支合并图
$ git log --graph --pretty=oneline --abbrev-commit

4.3 分支管理策略

通常合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
合并分支时,加上--no-ff参数禁用Fast forward,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
@普通模式合并分支
$ git merge --no-ff -m "merge with no-ff" dev
在实际开发中,我们应该按照几个基本原则进行分支管理:

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活。
干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都有自己的分支,时不时地往dev分支上合并就可以了。

4.4 Bug分支

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

@保存工作现场、去修复Bug
$ git stash

去master创建分支issue-101并修复Bug
首先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支
$ git checkout master
$ git checkout -b issue-101

$ git commit -m "fix bug 101"
[issue-101 4c805e2] fix bug 101
 1 file changed, 1 insertion(+), 1 deletion(-)
$ git switch master
$ git merge --no-ff -m "merged bug fix 101" issue-101

@返回工作现场
$ git switch dev
$ git status
On branch dev
nothing to commit, working tree clean
工作区是干净的,用git stash list命令看看

$ git stash list
stash@{0}: WIP on dev: f52c633 add merge
工作现场还在,Git把stash内容存在某个地方了,需要恢复

@恢复工作现场的两种方法
1)git stash apply 恢复后stash内容并不删除,你需要用git stash drop来删除;
$ git stash apply stash@{0}

2)git stash pop 恢复的同时把stash内容也删除

@将Bug修复合并到其它有Bug的分支
Git提供了一个cherry-pick命令,让我们能复制一个特定的提交到当前分支:
$ git branch
* dev
  master
$ git cherry-pick 4c805e2
[master 1d4b803] fix bug 101
 1 file changed, 1 insertion(+), 1 deletion(-)

4.6 Feature分支

开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。

4.7 多人协作

当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。
要查看远程库的信息,用git remote:
$ git remote
origin

用git remote -v显示更详细的信息(显示了可以抓取和推送的origin的地址):
$ git remote -v
origin  [email protected]:michaelliao/learngit.git (fetch)
origin  [email protected]:michaelliao/learngit.git (push)

@推送分支
把该分支上的所有本地提交推送到远程库。推送时要指定本地分支。
$ git push origin master

@抓取分支
多人协作时,大家都会往master和dev分支上推送各自的修改。工作模式通常是这样:
首先,可以试图用git push origin <branch-name>推送自己的修改;
        如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
                如果合并有冲突,则解决冲突,并在本地提交;
                没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!
                 如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。

4.8 Rebase

rebase操作可以把本地未push的分叉提交历史整理成直线;
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
$ git rebase

5 标签管理

5.1 创建标签

@打标签
首先切换到需要打标签的分支上

1) git tag <name>可以打一个新标签,默认标签是打在最新提交的commit上的
$ git tag v1.0

2) git tag <tagname> <commit id>可以给历史提交打标签

3) 创建带有说明的标签,用-a指定标签名,-m指定说明文字:
$ git tag -a v0.1 -m "version 0.1 released" 1094adb

注意:标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。

@查看标签
git tag 查看所有标签
git show <tagname> 查看标签信息

5.2 删除标签

git push origin <tagname>  推送一个本地标签
git push origin --tags  推送全部未推送过的本地标签
git tag -d <tagname>  删除一个本地标签
git push origin :refs/tags/<tagname>  删除一个远程标签

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章