github配置及使用

安装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 your_email@example.com

同样执行以下命令验证是否配置成功:

git config  user.name
git config  user.email

配置github网页端邮件地址
在github主页上登录你的账户,然后点击右上角的头像,然后点击Settings

进入设置后,点击Emails:

然后在Add email address那里添加你上一步配置的邮箱。之后github会发送一封邮件到你的邮箱,你验证以下就好了。

配置公钥
github需要确认你推送的代码确实是你推送的,而不是别人冒充的,因此需要你提供一个公钥。公钥就是你的指纹信息,用来验证你的身份。首先需要在本地生成公钥,在终端输入

ssh-keygen -t rsa -C "your_email@example.com"

不需要设置密码,一路回车。在询问秘钥存放地址时,可以指定目录,也可以用默认值。最后会生成一串类似于下面的字符,表示秘钥生成成功。

秘钥有两个,.pub结尾的是公钥。用记事本打开它,把里面的内容复制下来,登录github网站个人账号,在个人账号的settings-SSH and GPG keys里面,new SSH key,把公钥的内容粘贴到Key里面,Title随便取。

执行如下代码进行验证:

ssh -T git@github.com

可能会提示你输入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 git@github.com: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 <file>..." to update what will be committed)
  (use "git checkout -- <file>..." 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 <file>..." 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

原文地址:https://www.cnblogs.com/jiaxblog/p/9574441.html