Git篇
前言:Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。本文主要介绍git常用的一些命令。
安装
使用git命令,首先需要下载安装 git bash(此处链接为window版本,其他版本需另行下载) 命令行工具。
使用
git链接有两种方式:
- https (形如:https://github.com/terryvince/xxx.git)
- ssh (形如:git@github.com:terryvince/xxx.git)
两者区别在于,使用前者需要每次提交时输入账号密码,使用后者则需要到本地生成私钥和公钥,公钥需要在所使用的git平台(如github,gitlab等)配置。日常中,一般使用第二种方式,配置一次后,以后就不用输入账号密码也能推送仓库了。如果想要使用第二种,你需要先生成公钥:
> ssh-keygen -t rsa //生成的公钥路径在~/.ssh/id_rsa.pub
输入以上命令后会出现三次问询,不设密码的话可以回车直接跳过,如果是window系统,生成的公钥在C:\Users\Administrator\.ssh\id_rsa.pub 这个文件里,将该文件内容复制到你所使用的平台上即可(图示为github):
接下来第二步,如果你是首次使用,你需要配置名字和邮箱,该信息每一次 git 提交都会用到,表明代码是谁写的:
> git config --global user.name "username"
> git config --global user.email "xxx@xxx.com"
如果需要查看配置信息,输入以下命令:
> git config --list //包括之前配置的用户名和密码信息都在里边
名词解释
- 仓库:顾名思义,用来储存的地方,又叫版本库,可以放代码文件,也可以放其他的文件。
- 工作区(working dir):即当前的工作目录,你打开的项目就是一个工作目录。
- 缓存区(Index):它像个缓存区域,临时保存你的改动
- HEAD:本地版本库的一个指针,指向当前正在使用的版本库。
- 分支(branch): 就像是树一样,有不同分支,每个分支的代码都是独立的。在你创建仓库的时候,master 是“默认的”的主分支。在其他分支上进行开发,完成后再将它们合并到主分支上。
基础用法
创建版本库
> mkdir testdir && cd testdir
> git init
第一句命令,表示创建testdir目录并进入该目录,第二句则是初始化并创建了一个本地git仓库
把文件添加到缓存区
> touch readme.md
> git add readme.md //git add . “.”表示添加所有文件到缓存区
假如你后悔了,你可以撤销这个操作:
> git rm --cache readme.md
–cache 参数表示不删除文件,只是把文件撤出缓存区,不加的话就会连本地文件一起删除
如果你想要查看当前工作区有哪些文件有修改或变动,你可以:
> git status
这句命令的作用:
- 可以查看哪些文件改变了但还没有加入缓存区(untracked files)
- 可以查看哪些文件加入缓存区了,但还没有提交改动(Changes to be committed)
> git stash save "test-cmd-stash"
git stash 会把所有未提交的修改(包括暂存的和非暂存的)都保存起来,用于后续恢复当前工作目录。
save 可以附加消息,其他命令如下:
> git stash apply # apply 和 pop等同, 恢复之前保存的内容
> git stash drop stash@{0} # 移除stash@{0}
> git stash clear # 移除所有stash
> git stash show [stash@{0}] # 后面可跟stash,表示查看stash和本地的异同
stash适用于临时保存未完成的内容,保持git提交记录的干净,当完成其他任务后再回过头来恢复继续上一次的未完任务。
提交到本地版本库
> git commit -m "这是一段文本注释,解释提交改动了什么,随便写"
假如你又后悔了,你可以重置代码:
> git reset <commitId> --hard
//git reset b5176eace --hard
- –hard 选项表示丢弃当前工作区的更改,直接代码回滚。
- –soft,保留当前工作区更改,并回滚代码。
每次commit的时候,git 都会产生一个 commitId,这个commitId,可以通过log命令查看:
> git log --pretty=oneline -3
b5176eace01b3cdc886d09983417a985289e3635 (HEAD -> master, origin/master) update
5d289799e1511606539f0a2512d26bc4092cb50c update
8b7bfb9aafec24c3aa944078393f2d5d3ee4d7cd delete test.js
- –pretty=oneline 表示在一行显示
- -number 如果是一个数字,则表示显示前几个
第一列的数字字母就是commitId,这个id可以用做回滚代码时候的参数,commitId通常不必写全。
假如你回退代码(reset)后,仍然感到后悔,想回到未重置前的状态,你还可以查看之前的git操作历史:
> git reflog --pretty=oneline -3
b5176ea (HEAD -> master, origin/master) HEAD@{0}: checkout: moving from dev to master
104cc45 (origin/dev, dev) HEAD@{1}: checkout: moving from master to dev
b5176ea (HEAD -> master, origin/master) HEAD@{2}: commit: update
第一列则是对应历史操作的commitId,你可以很轻松的找到reset之前commitId,然后再重置(reset)一次,就可以逆向回滚回去。
提交到远程仓库
> git push -u origin master //将当前分支的代码提交到远程的主分支上
- -u 第一次提交带上该选项,其后的每次提交只需要git push即可
如果你不是克隆的仓库,并且是第一次提交,你需要先添加远程仓库:
> git remote add origin git@github.com:terryvince/xxx.git //origin 远程仓库的名字
添加远程仓库后,可以查看有哪些已添加的远程仓库
> git remote
origin
如果想要查看某个远程仓库的地址,可以输入:
> git remote get-url origin
git@github.com:terryvince/xxx.git
如果需要修改地址,可以输入:
> git remote set-url origin git@github.com:terryvince/xxx.git
克隆
克隆就相当于复制,将远程仓库复制到(搬到)本地来,默认只下载了maste分支的代码:
> git clone git@github.com:test/xxx.git
因为是克隆下来的仓库,本地就不需要用init命令来初始化仓库
分支操作
查看所有分支:
> git branch -a
dev
* master
remotes/origin/dev
remotes/origin/master
切换分支:
> git checkout <branch name>
//git checkout develop
特殊用法 ,放弃本地所有未提交的更改
git checkout .
创建并切换分支
> git checkout -b <branch name> <remote branch>
//git checkout -b develop origin/develop
- -b 表示切换的时候顺便创建分支(develop)
- <branch name> 创建的本地分支名字
- <remote branch> 远程分支不是必填的,写了之后新创建的本地分支会自动关联到远程分支上,这样提交的时候就不需要指定分支提交。
假如你已经创建了未关联的分支,你可以手动设置关联:
> git branch --set-upstream-to=origin/master master
- –set-upstream-to=origin/master master 表示设置本地的master分支与远程分支origin/master关联。关联目的是在执行git pull, git push操作时,就不需要指定对应的远程分支,你只要没有显示指定,git pull的时候,就会提示你There is no tracking information for the current branch.
删除分支:
> git branch -d <branch name>
合并分支:
> git merge <branch name>
当然,合并分支的时候,很可能会遇到代码冲突,当多人或者两个分支同时更改一处代码时。如果出现代码冲突你需要手动去解决,代码冲突长这个样子:
<<<<<<< HEAD
console.log(111)
=======
console.log(222)
>>>>>>> origin/master
- HEAD 指向的是本地版本库,代表本地的代码
- “==” 等号分隔了本地和远程的代码,等号下边的是远程分支的代码
不想要的代码直接删了就行了,处理好冲突的地方后,就可以重新提交一次:
> git add .
> git commit -m "解决代码冲突"
> git push
你也可以比较两个文件的异同,在加入缓存区(add)之前:
> git diff <source_branch> <target_branch>
拉取
假如,别人推送了一些代码到远程仓库上,你需要更新本地的代码,你可以:
> git pull
该命令会从远程仓库获取最新的代码,并自动合并到当前分支上,假如你不想要立即合并,你可以执行:
> git fetch <远程主机名> <分支名>
fetch之后,你可以查看fetch分支和当前分支的区别来决定要不要合并:
> git log -p FETCH_HEAD -1
- -p 查看push修改的内容
- FETCH_HEAD 代码fetch下来的代码分支
- -1 只显示最近的一条log
如果决定合并,执行次git merge FETCH_HEAD
即可。
标签
在软件发布时创建标签,是被推荐的。
> git tag 1.0.0 1b2e1d63ff
//1b2e1d63ff 要进行标记的commitId
推荐
命令操作git可能有些不便,我们可以图形化git版本工具来方便管理。比如Sourcetree:
此外,常用的编辑器vscode也有一些扩展可用:
- Git Graph 图形化git
- GitLens — Git supercharged 这个扩展用来防止别人甩锅,可以在编辑器中清晰的看到某段代码是谁写的,什么时候写的,推荐安装。