最近开始由SVN阵营投向了git,这篇博客记录了我学习使用git的经验
安装git
Mac和Linux上通常会预装Git,运行:
git --version
该命令会输出您计算机上所安装的Git版本号。如果没有得到版本号信息,则您需要安装git,下面是一些工具:
- Windows:git for windows
- Linux:Linux Terminal
- Mac OS: Terminal
我使用的是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
维护的三棵“树”组成。第一个是你的工作目录,它持有实际文件;第二个是暂存区(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 --