JustYeh的前端博客

Git的使用

2018-03-28

git

最近开始由SVN阵营投向了git,这篇博客记录了我学习使用git的经验

安装git

Mac和Linux上通常会预装Git,运行:

git --version

该命令会输出您计算机上所安装的Git版本号。如果没有得到版本号信息,则您需要安装git,下面是一些工具:

我使用的是Windows操作系统,并且使用的是阿里云的git平台,所以下面的内容都是基于以上条件的;

添加SSH Key

SSH key 可以让你在你的电脑和Code服务器之间建立安全的加密连接。

为什么需要SSH Key呢?因为远程服务器需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,远程服务器只要知道了你的公钥,就可以确认只有你自己才能推送。

以阿里云Code平台为例,在阿里云上,您需要使用SSH Keys来连接您的计算机和阿里云Code账号。与您的阿里云Code账号关联的每台计算机都需要一个不同的Key。

先执行以下语句来判断是否已经存在本地公钥

cat ~/.ssh/id_rsa.pub

如果你看到一长串以 ssh-rsa或 ssh-dsa开头的字符串, 你可以跳过ssh-keygen的步骤。

提示: 最好的情况是一个密码对应一个ssh key,但是那不是必须的。你可以一路回车,使用默认值即可。请记住设置的密码并不能被修改或获取。

你可以按如下命令来生成ssh key

ssh-keygen -t rsa -C "[email protected]"

这个指令会要求你提供一个位置和文件名去存放键值对和密码,你可以点击Enter键去使用默认值。

用以下命令获取你生成的公钥

cat ~/.ssh/id_rsa.pub

复制这个公钥放到你的个人设置中的SSH/My SSH Keys下,请完整拷贝从ssh-开始直到你的用户名和主机名为止的内容。

如果打算拷贝你的公钥到你的粘贴板下,请参考你的操作系统使用以下的命令:

Windows:

clip < ~/.ssh/id_rsa.pub

Mac:

pbcopy < ~/.ssh/id_rsa.pub

GNU/Linux (requires xclip):

xclip -sel clip < ~/.ssh/id_rsa.pub

重置秘钥与密码

重新执行一次以上操作即可。

添加git用户名和设置邮箱

您创建的每次Git提交都会使用该信息,所以很重要。

设置用户名

git config --global user.name 'your name'

检查用户名

git config --global user.name

设置邮箱

git config --global user.email 'your email'

检查邮箱

git config --global user.email

验证前面做的那些配置

git config --global --list

由于使用了“--global”选项,所以您只需要做一次这样的配置。Git会在您系统的任何项目中使用这个信息。如果您希望在某个特定的项目中使用不同的用户名和邮箱地址,可以在那个项目中重新运行该命令,但不加“--global”选项。

git工作流

git工作流

你的本地仓库由 git 维护的三棵“树”组成。第一个是你的工作目录,它持有实际文件;第二个是暂存区(Index),它像个缓存区域,临时保存你的改动;最后是 HEAD,指向你最近一次提交后的结果。

下面是一个常见修改代码的流程:你在本地修改了代码,然后使用add命令将文件提交到暂存区,此时你的代码被暂存了;然后使用commit命令将暂存区的文件提交到版本库;最后使用push命令将本地的改动推送到远程,至此,你便“成功”的完成了对代码的修改!

版本库的相关操作

初始化一个版本库

版本库又名仓库,英文名repository,你可以简单理解成一个目录,通过git init命令把这个目录变成Git可以管理的仓库,然后这个目录里面的每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

mkdir lq
cd lq
git init

添加文件到暂存区

git add readme.txt

如果觉得一个一个add比较麻烦,可以使用这个命令:

git add .

查看文件状态

git status

将暂存区的文件提交到版本库

git commit –m "你的注释"

将文件从暂存区移除,并完全删除

git rm readme.txt

重命名文件

git mv reademe.txt readme

查看提交的历史记录

git log

远程仓库

本地库与远程库关联

现在有这样一个情景:你已经在自己的电脑上创建了一个Git仓库,并且没有clone现有的仓库,现在你希望将你的本地仓库连接到某个远程服务器,使用这个命令可以把一个已有的本地仓库与远程库关联。

git remote add origin yourgitaddress(你的git地址)

添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。

之后,你就可以使用push命令将本地库的所有内容推送到远程库上了。

Clone远程版本库

通过本地库与远程库关联我们了解了先有本地库,后有远程库的时候,如何关联远程库。

现在,假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆,使用这个命令,你就可以将远程库克隆到自己的电脑本地:

git clone yourgitaddress(你的git地址)

当有多个人协作开发时,每个人各自从远程克隆一份就可以了。

查看远程仓库信息

当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin,下面的命令可以查看远程仓库的信息:

git remote -v

git remote show命令加上主机名,可以查看该主机的详细信息,比如:

git remote show origin

删除远程仓库

下面的命令用于删除远程主机。

git remote rm <主机名>

推送你的更新到远程服务器

git push命令用于将本地分支的更新,推送到远程主机,语法为:

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

如果省略远程分支名,则表示将本地分支推送与之存在"追踪关系"的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。

git push origin master

上面命令表示,将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。

比如我现在有一个本地master分支,需要推送到远程库的test分支,就需要使用下面的命令:

git push origin master:test

如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。

$ git push origin :master
# 等同于
$ git push origin --delete master

上面命令表示删除origin主机的master分支。

更新远程分支

当远程仓库的版本库有了更新,需要将这些更新取回本地,拉取远程仓库的数据,语法为:

git fetch [remote-name]

默认情况下,git fetch取回所有分支(branch)的更新。如果只想取回特定分支的更新,可以指定分支名。比如,取回origin主机的master分支:

git fetch origin master

fetch 会拉去最新的远程仓库数据,但不会同步数据到当前目录下。如果要自动合并数据,就需要使用pull命令。

git pull命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并,他的格式如下:

git pull <远程主机名> <远程分支名>:<本地分支名>

如果远程分支是与当前分支合并,则冒号后面的部分可以省略。

git pull origin next

上面命令表示,取回origin/next分支,再与当前分支合并。实质上,这等同于先做git fetch,再做git merge

git fetch origin
git merge origin/next

分支管理

创建新分支

下面的命令创建了一个叫yeh的分支并切换了过去

git branch -b yeh

相当于以下两条命令:

git branch yeh
git checkout yeh

你也可以在已有分支的基础上创建一个新的分支:

git checkout -b newBrach origin/master

上面命令表示,在origin/master的基础上,创建一个新分支。

切换到指定分支

git checkout branchName

查看分支

git branch命令会列出所有分支,当前分支前面会标一个*号

git branch
* yeh
  master

合并分支

git merge命令用于合并指定分支到当前分支。假设我们现在处于master分支下,下面的命令将会把yeh合并到master分支

git merge yeh

删除分支

因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

git常见后悔药

  • 撤销本地全部没有git add过的修改:
git checkout -- .
  • 使用库上文件覆盖本地修改(当然是指用本地库覆盖):
git checkout file_name
  • 回退掉某一次commit,回退方式是自动生成一个反向的commit,不会影响其他:
commmitgit revert commitID
  • 将git库状态强制回退到某个节点号,这个节点号之后的commit全部丢失:
git reset --hard commitID
  • 将远端库强制覆盖到本地,放弃本地全部修改:
git reset --hard origin 分支名
  • 回退最近一次的commit,且该次commit所作的修改会退到没有被add的状态:
git reset --mixed HEAD~1
  • 回退最近的一次commit,回退后该次commit所作的修改仍处于add过了的状态,可以通过git status查看状态:
git reset --soft HEAD~1
  • 回退最近一次的commit,回退的同时working tree也会被修改,也就是回退的这次的commit所做的修改都会消失:
git reset --hard HEAD~1
  • 恢复删除的某个文件:
$ git checkout -- test.txt
  • 如果要恢复多个被删除的文件,可以使用批处理命令:
git ls-files -d | xargs git checkout --
  • 如果要恢复被修改的文件,命令:
git ls-files -m | xargs git checkout --