安装git
对于linux系统,不同发行版本的安装方法不一样,请参考https://git-scm.com/download/linux。以ubuntu为例:
sudo add-apt-repository ppa:git-core/ppa
sudo apt update
sudo apt install git
如果是windows系统,则直接安装客户端即可,客户端下载地址:
https://www.git-scm.com/download/
配置github
配置本地用户名和邮箱
我们可以配置一个全局的用户名和邮箱,这样本地所有的git操作都会默认使用这个用户名和邮箱,方法如下:
git config --global user.name your_user_name
git config --global user.email your_email.example.com
执行以下命令验证是否配置成功,如果输出的用户名和邮箱和你配置的相同,则配置成功:
git config --global user.name
git config --global user.email
当然你也可以对某个本地代码仓库单独设置一个用户名和邮箱。首先切换到你的本地代码仓,然后执行:
git config user.name your_user_name
git config user.email [email protected]
同样执行以下命令验证是否配置成功:
git config user.name
git config user.email
配置github网页端邮件地址
在github主页上登录你的账户,然后点击右上角的头像,然后点击Settings
:
进入设置后,点击Emails
:
然后在Add email address
那里添加你上一步配置的邮箱。之后github会发送一封邮件到你的邮箱,你验证以下就好了。
配置公钥
github需要确认你推送的代码确实是你推送的,而不是别人冒充的,因此需要你提供一个公钥。公钥就是你的指纹信息,用来验证你的身份。首先需要在本地生成公钥,在终端输入
ssh-keygen -t rsa -C "[email protected]"
不需要设置密码,一路回车。在询问秘钥存放地址时,可以指定目录,也可以用默认值。最后会生成一串类似于下面的字符,表示秘钥生成成功。
秘钥有两个,.pub结尾的是公钥。用记事本打开它,把里面的内容复制下来,登录github网站个人账号,在个人账号的settings-SSH and GPG keys里面,new SSH key,把公钥的内容粘贴到Key里面,Title随便取。
执行如下代码进行验证:
ssh -T [email protected]
可能会提示你输入yes进行确认,确认之后出现下面的提示,说明配置成功,可以连接github了。如果你有多台电脑,则需要把多台电脑端的公钥都生成出来,复制到你的github账号上,这样你就可以在多台电脑上开发啦。
Warning: Permanently added 'github.com,192.30.253.113' (RSA) to the list of known hosts.
Hi JiaxYau! You've successfully authenticated, but GitHub does not provide shell access.
创建代码仓库并提交
创建目录,初始化仓库
mkdir project_code
cd project_code
git init # 初始化代码仓库
初始化后,代码仓库根目录下会出现一个.git目录,是用来做代码仓库管理的。
新建文件并提交
在代码仓库下新建文件,比如新建一个readme.md,在里面写上一些内容后提交。
git add readme.md
git commit -m "add readme.md"
必须先用git add
来添加你需要提交的文件,然后再用git commit
来提交。-m后缀后面需要添加一段文字描述,用来解释你做了什么。比如我们这次添加了一个readme文件,那就在-m后加以描述即可。这段文字描述建议不要漏掉,因为别人在看你的代码提交记录的时候,可以知道你做了什么,从而更有利于团队协作。
添加远程库
第一个方法是现在github网站上新建一个代码仓库,然后克隆到本地。这个比较简单,不说了。
第二个方法是本地已经写了一部分代码了,需要把本地的代码和远程仓库关联起来。第一步也是要在github网站上新建一个空的代码仓库,然后执行下面的命令:
git remote add origin [email protected]:JiaxYau/learngit.git #后面的链接是你新建的git代码库的链接
之后就可以把本地的代码推送到远程仓库了:
$ git push -u origin master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 233 bytes | 233.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'master' on GitHub by visiting:
remote: https://github.com/JiaxYau/learngit/pull/new/master
remote:
To github.com:JiaxYau/learngit.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
工作区、暂存区和版本库
工作区(working directory)就是你能看到的目录,版本库就是.git文件夹,暂存区是版本库的一部分。它们的关系入下图所示:
修改了文件之后,使用git add命令,将修改的内容添加到暂存区,再通过git commit将其从暂存区提交到当前分支。如果修改了readme.md,但是没有执行git add,这个时候执行git status查看工作区状态,会提示
On branch master
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: readme.md
no changes added to commit (use "git add" and/or "git commit -a")
"Changes not staged for commit:"说的就是没有把修改的内容加到暂存区。
执行了git add之后,再执行git status,会提示我们修改内容未提交:
On branch master
Changes to be committed:
(use "git reset HEAD ..." to unstage)
modified: readme.md
这个时候再执行git commit,就把修改的内容提交到分支上了。这时再执行git status,会提示工作区是干净的:
On branch master
nothing to commit, working tree clean
版本回退
我们每执行一次commit,就产生一个版本。执行git log可以看到当前所有的提交记录,也就是每个版本的信息。每个版本都有一个commit id,版本回退的时候,只需要执行git reset --hard commit_id
(commit_id不需要输完,输入前6位即可),就可以回退到对应的版本中。
github有一个HEAD指针,指向当前版本。如下图,最上面的是最新的版本,执行版本回退之后,github只是将HEAD指针指向了历史版本而已。
此外还有一个小诀窍,HEAD是当前版本,HEAD^则是上一个版本,HEAD^^则是上上一个版本,HEAD~100则是往前倒数第100个版本……所以如果只是回退到上一个版本,可以直接git reset --hard HEAD^
。
如果我们回退了版本之后,后悔了,又想恢复到较新的版本,怎么办呢?由于这个时候执行git log是看不到较新版本的记录的,需要执行git reflog才行。这个时候我们就得到了所有版本的commit_id,再执行git reset --hard commit_id
,就可以吃上后悔药,恢复到较新版本了。
管理修改
修改了内容,未执行git add
这个时候,修改的内容只是存在于工作区中,这个时候直接执行git checkout -- readme.md
即可(即把版本库的readme.md签出到工作区)。注意"--"不能少,不然就是切换分支了。
修改了内容,执行了git add,未执行git commit
这个时候,修改的内容以及添加到暂存区,但为提交到分支,先执行git reset HEAD readme.md
将暂存区的修改撤销掉(也就是把readme.md恢复到当前分支的状态),再执行git checkout -- readme.md
将修改从工作区中删除。
修改了内容,执行了git commit
直接进行版本回退,执行git reset --hard HEAD^
,即可回退到上一个版本。
删除文件,如何恢复
假设我们分支里有一个test.txt文件(即已经commit到分支),这个时候我们在工作区中把test.txt删除了,该如何恢复呢?由于版本库中还有test.txt,我们只要把它签出即可:git checkout -- test.txt
。当然还有另一种情况,就是我们确实是要删掉test.txt的,那么我们需要先执行git rm test.txt
,再执行git commit -m "xxx"
即可。这和新增修改是一样的。
由于工作区的修改是要提交到版本库才会生效,所以可以通过将版本库的文件签出来回复工作区的修改;而如果修改已经添加到暂存区,则要先通过分支来恢复暂存区的内容,再签出到工作区即可。如果修改已经提交到分支,则只能进行版本回退了。
分支管理
创建和合并分支
方法1,创建分支的同时,切换到新建分支:
git checkout -b dev # dev是新建分支名
方法2:,先新建分支,再切换:
git branch dev
git checkout dev
通过git branch
可以查看当前分支。在我们新建dev分支后,HEAD指针立即指向dev,所以创建分支的过程很快,只需要修改HEAD指针的指向即可。当我们在dev上修改了代码,提交到dev分支后,想把dev合并到master分支,那么需要先切换到master,然后再merge:
git checkout master
git merge dev
上面的方式是Fast-forward
模式,即“快进模式”,直接把master指向当前的提交。这种方式速度快,但是有一个缺点,就是当我们把dev分支删除后,dev分支的信息就丢失了。如果希望保留dev分支信息,可以用--no-ff
方式:
git checkout master
git merge --no-ff -m "merge with no-ff" dev
这样相当于新建了一个commit(看到-m这个参数了吗),通过下面的命令,我们可以看到这个commit的信息:
git log --graph --pretty=oneline --abbrev-commit
这个时候就可以把dev分支删除了:
git branch -d dev
解决冲突
TBD
其他常用命令
git diff HEAD -- readme.md
:查看当前版本和工作区中readme.md的差异git remote add origin git@server-name:path/repo-name.git
:关联远程仓库git push -u origin master
:第一次推送master分支的所有内容到远程仓库
参考资料
github官网doc:https://help.github.com/
廖雪峰博客:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000