一、使用Github(gitLab)的前期准备
1、本地环境,设置姓名和邮箱
- 设置使用Git时的姓名和邮箱地址
git config --global user.name "Firstname Lastname"
git config --global user.email "your_email@example.com"
注意:
- 1.查看用户名和邮箱地址
$ git config user.name $ git config user.email
- 2.修改全局用户名和邮箱地址
$ git config --global user.name "username" $ git config --global user.email "email"
- 3.修改局部用户名和邮箱地址:
$ cd ~/you project $ git config user.name "username" $ git config user.email "email"
- 4.windows 下修改git 登录账号密码[blog.csdn.net/qq_29298577…]
$ 第一步:控制面板 -----> 用户账户 $ 第二步:用户账户------> 管理windows凭据 $ 第三步:找到对应的地址修改登录名称和密码即可 ``
2、设置SSH Key
- 首先,你得有个Github账号(gitLab也适用)。连接Github上已有仓库时的认证,是通过使用了SSH的公开密钥认证方式进行的。 运行下面的命令创建 SSH Key。
$ ssh-keygen -t rsa -C "your_email@example.com"
Generating public/private rsa key pair.
Enter file in which to save the key
(/Users/your_user_directory/.ssh/id_rsa): 按回车键
Enter passphrase (empty for no passphrase): 输入密码
Enter same passphrase again: 再次输入密码
- 输入密码后会出现以下结果。
Your identification has been saved in /Users/your_user_directory/.ssh/id_rsa.
Your public key has been saved in /Users/your_user_directory/.ssh/id_rsa.pub.
The key fingerprint is:
fingerprint值 your_email@example.com
The key's randomart image is:
+--[ RSA 2048]----+
| .+ + |
| = o O . |
略
id_rsa 文件是私有密钥,id_rsa.pub 是公开密钥。
- Git查看已生成公钥和密钥
- 通过命令窗口,打开你的git bash 窗口
- 进入.ssh目录:
cd ~/.ssh - 查看公钥:cat id_rsa.pub 或者vim id_rsa.pub;或者你也可以直接输入命令 :
cat ~/.ssh/id_rsa.pub;或者你也可以直接打开你用户(一般都是Administrator)下的.ssh文件夹,打开它里面的id_rsa.pub 文件。
$ cat ~/.ssh/id_rsa.pub
ssh-rsa 公开密钥的内容 your_email@example.com
如果通过上面的方式找不到公钥,你就需要先生成公钥了。
3、添加公开密钥
- GitHub 中添加公开密钥,今后就可以用私有密钥进行认证了。
- 添加成功之后,创建账户时所用的邮箱会接到一封提示“公共密钥添加完成”的邮件。 完成以上设置后,就可以用手中的私人密钥与 GitHub 进行认证和通信了。让我们来测试下连接是否成功。
$ ssh -T git@github.com
The authenticity of host 'github.com (207.97.227.239)' can't be established.
RSA key fingerprint is fingerprint值 .
Are you sure you want to continue connecting (yes/no)? 输入yes
出现如下结果即为成功。
Hi hirocastest! You've successfully authenticated, but GitHub does not
provide shell access.
4、创建远程仓库
- 首先创建Github远程仓库
- clone已有仓库
$ git clone git@github.com:hirocastest/Hello-World.git
Cloning into 'Hello-World'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
$ cd Hello-World
然后,就可以在本地开心的敲代码了~~
二、Git实际操作
1、Git基本操作
git init初始化仓库 初始化仓库成功后,,.git目录里存储着当前目录内容所需的仓库数据。 在Git中,包含.git目录的内容称为”附属于该仓库的工作树“。文件的编辑等操作在工作树中进行,然后记录到仓库中,以此管理文件的历史快照。git status查看仓库状态git add向暂存区中添加文件 要想让文件成为Git仓库的管理对象,就需要用git add命令将其加入暂存区。 暂存区是提交之前的一个临时区域。git commit保存仓库的历史记录git commit命令可以将当前暂存区中的文件实际保存到仓库的历史记录中。通过这些记录,我们就可以在工作树中复原文件。
- 记录一行提交信息
$ git commit -m "First commit"
- 记录详细的提交
如果想要记述得更加详细,请不加
-m,直接执行git commit命令。执行后编辑器就会启动,并显示如下结果。
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
#
# Initial commit
在编辑器中记述提交信息的格式如下
- 第一行:用一行文字简述提交的更改内容
- 第二行:空行
- 第三行以后:记述更改的原因和详细内容
git log查看提交日志
- 只显示提交信息的第一行
$ git log --pretty=short - 只显示指定目录、文件的日志
$ git log README.md - 显示文件的改动
$ git log -p
$ git log -p README.md
参数有很多,用到就去查一下。
git diff
git diff命令可以查看工作书、暂存区、最新提交之间的差别。
- 查看工作树和暂存区的差别
执行 git diff命令,查看当前工作树与暂存区的差别。
如果我们尚未用git add命令向暂存区添加任何东西,所以程序只会显示工作树与最新提交状态之间的差别,也就不会显示任何内容。
DELL@DESKTOP-L7RGC6H MINGW64 ~/Desktop/新建文件夹 (5) (master)
$ git diff
DELL@DESKTOP-L7RGC6H MINGW64 ~/Desktop/新建文件夹 (5) (master)
- 查看工作树和最新提交的差别
要查看与最新提交的差别,请执行以下命令。
$ git diff HEAD
不妨养成这样一个好习惯:在执行
git commit命令之前先执行git diff HEAD命令,查看本次提交与上次提交之间有什么差别,等确认完毕后再进行提交。当前,你最好用webstrome或者其他可视化视图工具,更方便的查看。 这里的 HEAD 是指向当前分支中最新一次提交的指针。
2、分支基础操作
git branch-显示分支一览表git checkout -b-创建并切换分支git merge-分支合并
合并分支时,加上--no-ff参数git merge --no-ff master_dev1,编辑器会启动,用于录入要提交的信息。
git log --graph以图表的形式查看分支(webstronme有更丰富的操作)
3、更改提交操作
git reset回溯历史版本
要让仓库的HEAD、暂存区、当前工作树回溯到指定状态 。只有提供目标时间的哈希值,并使用git reset --hard命令即可。
$ git reset --hard 47febf026b47194be1586a6457ed59987dbb333a
git commit --amend修改提交信息(就是git commit -m时候的写的信息)
要修改上一条提交信息,可以使用git commit --amend命令。
执行命令后,编辑器会启动,修改就是了。
git rebase -i-压缩历史
4、推送至远程分支
git remote add-添加远程仓库
使用git remote add命令将其设置为本地仓库的远程仓库。
$ git remote add origin git@github.com:github-book/git-tutorial.git
git push推送至远程仓库
将当前分支下本地仓库中的内容推送给远程仓库,需要用到git push命令。
-u参数可以在推送的同时,将 origin 仓库的 master 分 支设置为本地仓库当前分支的 upstream(上游)。添加了这个参数,将来 运行 git pull命令从远程仓库获取内容时,本地仓库的这个分支就可 以直接从 origin 的 master 分支获取内容,省去了另外添加参数的麻烦。
- 推送至 master 以外的分支
除了 master 分支之外,远程仓库也可以创建其他分支。
$ git checkout -b feature-D
Switched to a new branch 'feature-D'
现在将它 push 给远程仓库并保持分支名称不变。
$ git push -u origin feature-D
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:github-book/git-tutorial.git
* [new branch] feature-D -> feature-D
Branch feature-D set up to track remote branch feature-D from origin.
git clone获取远程仓库
$ git clone git@github.com:github-book/git-tutorial.git
Cloning into 'git-tutorial'...
remote: Counting objects: 20, done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 20 (delta 3), reused 20 (delta 3)
Receiving objects: 100% (20/20), done.
Resolving deltas: 100% (3/3), done.
$ cd git-tutorial
们用 git branch -a命令查看当前分支的相关信息。
- 获取远程的 feature-D 分支
将 feature-D 分支获取至本地仓库。
$ git checkout -b feature-D origin/feature-D
Branch feature-D set up to track remote branch feature-D from origin.
Switched to a new branch 'feature-D'
git pull获取最新的远程仓库分支 使用git pull命令,将本地的 feature-D 分支更新到最新状态
$ git pull origin feature-D
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 3 (delta 1), reused 3 (delta 1)
Unpacking objects: 100% (3/3), done.
From github.com:github-book/git-tutorial
* branch feature-D -> FETCH_HEAD
First, rewinding head to replay your work on top of it...
Fast-forwarded feature-D to ed9721e686f8c588e55ec6b8071b669f411486b8.
如果两人同时修改了同一部分的源代码,push 时就很容易发生冲 突。所以多名开发者在同一个分支中进行作业时,为减少冲突情况的发 生,建议更频繁地进行 push 和 pull 操作。
5、GIT常见问题
1.git push失败
- 问题描述:Authentication failed,又不弹窗填写账户密码
解决方案(window下):控制面板\所有控制面板项\凭据管理器\Window凭证,删除对应的凭证即可

三、Github的注意功能
1、Pull Request
Pull Request 是自己修改源代 码后,请求对方仓库采纳该修改时采取的一种行为。Pull Request 概念图如下:

2、仓库的维护
Fork 或 clone 来的仓库,一旦放置不管就会离最新的源代码越来越远。 通常来说 clone 来的仓库实际上与原仓库并没有任何关系。所以我们需要将原仓库设置为远程仓库,从该仓库获取(fetch)数据与本地仓库进行合并(merge),让本地仓库的源代码保持最新状态。如下图:

- 仓库的Fork与clone 将 octocat/Spoon-Knife 作为原仓库,在 GitHub 上进行 Fork,然后clone。
$ git clone git@github.com:hirocastest/Spoon-Knife.git
Cloning into 'Spoon-Knife'...
remote: Counting objects: 24, done.
remote: Compressing objects: 100% (21/21), done.
remote: Total 24 (delta 7), reused 17 (delta 1)
Receiving objects: 100% (24/24), 74.36 KiB | 68 KiB/s, done.
Resolving deltas: 100% (7/7), done.
$ cd Spoon-Knife
- 给仓库设置名称 我们给原仓库设置 upstream 的名称,将其作为远程仓库。
$ git remote add upstream git://github.com/octocat/Spoon-Knife.git
今后,我们的这个仓库将以 upstream 作为原仓库的标识符。这个环境下只需要设定一次。
- 获取最新数据(fetch到的代码,不会自动和本地代码合并)
第一步:从远程仓库实际获取(fetch)最新源代码。 第二步:与自己仓库的分支进行合并。要让仓库维持最新状态,
$ git fetch upstream
From git://github.com/octocat/Spoon-Knife
* [new branch] master -> upstream/master
$ git merge upstream/master
Already up-to-date.
!--注意--注意--:git fetch 和git pull 的差别
git fetch相当于是从远程获取最新到本地,不会自动merge,如下指令:
git fetch orgin master //将远程仓库的master分支下载到本地当前branch中
git log -p master ..origin/master //比较本地的master分支和origin/master分支的差别
git merge origin/master //进行合并
也可以用以下指令:
git fetch origin master:tmp //从远程仓库master分支获取最新,在本地建立tmp分支
git diff tmp //將當前分支和tmp進行對比
git merge tmp //合并tmp分支到当前分支
git pull相当于是从远程获取最新版本并merge到本地
git pull origin master
git pull 相当于从远程获取最新版本并merge到本地
补充:
fetch的时候本地的master[ID=1]没有变化,如果与远程仓关联的那个版本号master[ID=2]被更新了。我们接下来就是在本地合并这两个版本号的代码master[ID=3],此时会有三个版本号,可查可用。git pull的会将本地的代码更新至远程仓库里面最新的代码版本。至于两个版本号,代码有丢失风险。
总结:以下借鉴文献
不要用git pull,用git fetch和git merge代替它。 git pull的问题是它把过程的细节都隐藏了起来,以至于你不用去了解git中各种类型分支的区别和使用方法。当然,多数时候这是没问题的,但一旦代码有问题,你很难找到出错的地方。看起来git pull的用法会使你吃惊,简单看一下git的使用文档应该就能说服你。 将下载(fetch)和合并(merge)放到一个命令里的另外一个弊端是,你的本地工作目录在未经确认的情况下就会被远程分支更新。当然,除非你关闭所有的安全选项,否则git pull在你本地工作目录还不至于造成不可挽回的损失,但很多时候我们宁愿做的慢一些,也不愿意返工重来。
3、接收Pull Request
点击Pull Request 查看详细内容。

Merge pull request 按钮,Pull Request 的内容便会自动合并至仓库。
注意:
在采纳之前,请尽量将接收到的 Pull Request 拿到本地开发环境中进行检查,确认是否能够正常运行以及代码是否安全。
3.1、 采纳 Pull Request 前的准备
- 代码审查 在 GitHub 上可以对 Pull Request 的具体的某行代码进行评论。
- 查看图片的差别
- 在本地开发环境中反映 Pull Request 的内容
下面我们来讲解收到 Pull Request 后在本地开发环境中进行实际检查的流程。在本示例中,Pull Request 接收方的用户名为ituring,发送方的用户名为“PR 发送者”。

$ git clone git@github.com:ituring/first-pr.git
Cloning into 'first-pr'...
remote: Counting objects: 34, done.
remote: Compressing objects: 100% (26/26), done.
remote: Total 34 (delta 10), reused 15 (delta 4)
Receiving objects: 100% (34/34), 89.48 KiB | 112 KiB/s, done.
Resolving deltas: 100% (10/10), done.
$ cd first-pr
(2)获取发送方的远程仓库 将 Pull Request 发送方的仓库设置为本地仓库的远程仓库,获取发送方仓库的数据。
$ git remote add PR发送者 git@github.com:PR发送者/first-pr.git
$ git fetch PR发送者
省略
From github.com:PR发送者/first-pr
* [new branch] gh-pages -> PR发送者/gh-pages
* [new branch] master -> PR发送者/master
* [new branch] work -> PR发送者/work
注意:fetch之后,只是获取了远程仓库的数据,这些数据尚未反映在任何一个分支中。需要创建一个分支,用来显示的承载fetch到的代码
(3)先从接收者新建一个分支,和发送pull request的分支合并,测试功能。 从接收者的本地仓库中,新建一个分支后,用这个分支和fetch到发送pull reuqest的远程仓库数据合并
$ git checkout -b pr1
Switched to a new branch 'pr1'
$ git merge PR发送者/work
Updating cc62779..243f28d
Fast-forward
index.html | 2 ++
1 file changed, 2 insertions(+)
(4)采纳 Pull Request
完成上述内容后,如果 Pull Request 的内容没有问题,大可打开浏览器找出相应的 Pull Request 页面,点击 Merge pull request 按钮,随后Pull Request 的内容会自动合并至仓库。 不过,由于我们已经在本地构筑了相同的环境,只要通过 CLI 进行合并操作再 push 至 GitHub,Pull Request 中就会反映出 Pull Request 被采纳后的状态。
更新中。。。