Git入门

目前用Git,主要用于在GitHub上托管代码笔记
所有的改动都在master分支上,并没有其他分支
这篇文章只是简单地完成git的安装, 本地版本库的创建,远程版本库的关联,文件上传,拉取等基本操作
关于文件冲突处理,版本回退,此篇尚未涉及

安装

ubuntu下安装:

sudo apt install git

windows 下安装,需下载安装包

Git 本地仓库的创建

通俗地讲,本地任何一个目录都可以是本地仓库。只需要启动Terminal(ubuntu)或Git Bash(windows),cd进入指定目录,运行

git init

即可以初始化一个空的本地仓库。此时,该目录下会多出一个.git子目录,它是Git用来跟踪管理版本库的。当然,如果你想取消版本管理,删除这个目录即可。

Git 不同于 Subversion 的地方在于,Git是分布式的版本管理系统,没有中央服务器。这大概解释了Git可以创建本地仓库的原因,而Subversion的使用必须要借助互联网。

关于集中式分布式的讨论,此处不作多的说明,没有使用经验支撑,那些优劣列出来,没有什么意义。

Git 关联GitHub远程仓库

Git支持基于SSH和https关联远程仓库,但推荐使用SSH方式,它更加安全。在本地仓库要想和GitHub远程仓库关联,首先需要在GitHub中配置SSH and GPG keys。

通过

ssh-keygen -t rsa -C "yourEmail@xx.com"

获取ssh密钥文件,操作过程中会提示确认保存文件的位置以及要求输入密码,以下是命令输出(windows 平台)。

Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/mayn/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/mayn/.ssh/id_rsa.
Your public key has been saved in /c/Users/mayn/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Yy7sS0KnY+iaQDLldwI43znocIboZhDbD5ZPwjzMybU yourEmail@xx.com
The key's randomart image is:
+---[RSA 2048]----+
|                 |
| .               |
|+ o .            |
|./ B o           |
|O.^ E o S        |
|=B @ B o .       |
|.+o B + .        |
|+o . = .         |
|o..   o.         |
+----[SHA256]-----+

命令执行完成之后,会在 用户目录 下生成一个.ssh目录,里面包含了密钥信息。

然后在GitHub页面添加新的ssh key,配置完成以后,便可以将本地仓库和远程仓库关联,并将本地文件上传到远程(通常,你需要先add并且commit文件到本地版本库):

git remote add origin git@github.com:wangy325/repositoryName.git
git push -u origin master

Git的工作模式简单介绍

  • 工作区(workspace):即当前工作目录
  • 暂存区(stage/index):.log目录下的的index文件中,暂存区域保存的是本地“已add”但“未commit”的改动
  • 版本库(local repository):本地版本库,commit之后文件信息变保存在其中
  • 远程仓库(remote repository):远程版本库,push推送本地文件到远程版本库,fetch从远程版本库拉取 资源 版本信息,pull从远程版本库中拉取资源

Git本地工作区暂存区版本库的概念,图引自yiibai.com

Git 版本控制的一些主要概念:

  • 3个步骤:
    1. add命令只添加文件到暂存区
    2. commit命令将文件添加到本地版本库
    3. push命令将本地版本库的内容推送到远程仓库
  • 4个区:
    1. workingAera
    2. stage
    3. local repository
    4. remote repository
  • 5种状态
    1. origin
    2. modified
    3. staged
    4. committed
    5. pushed

常用命令

git command --help 可以打开帮助文档
git config --global credential.helper store 保存用户凭证,避免每次push/pull都需要输入密码

添加文件到仓库(暂存区)
git add file1 ...

提交文件到仓库之前,需要配置用户名和电子邮件

git config --global user.name "username"
git config --global user.email "yourEmail@qq.com"
提交文件到仓库
git commit -m "commit comment"
查看当前仓库的状态
$ git status
On branch master
Your branch is up to date with 'origin/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

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        Main.java

no changes added to commit (use "git add" and/or "git commit -a")
查看某个文件的差异信息
  • git diff

    查看暂未add到暂存区的改动,也就是状态为modified的文件,如果文件已经staged,则此命令不会显示差异信息

  • git diff --cached

    查看已经add到暂存区的改动,也就是状态为staged的文件,如果文件处于modified状态,则此命令不会显示差异信息

  • git diff HEAD

    查看已暂存和未暂存的所有改动

  • git diff --stat

    显示差异的摘要信息

  • git diff master origin/master

    显示本地仓库和远程仓库之间的文件的差异信息,即committedpushed两个状态之间的差

  • git diff versionCode1 versionCode2

    显示两个版本(号)之间的差异信息,less打开

    $ git diff readme.md
    warning: LF will be replaced by CRLF in readme.md.
    The file will have its original line endings in your working directory.
    diff --git a/readme.md b/readme.md
    index bb8298f…222e2da 100644
    — a/readme.md
    +++ b/readme.md
    @@ -6,3 +6,5 @@

    • Java的回调机制
    • idea的多线程调试
    • 拦截器

    +> you can’t live your life based on other people’s point of view.

查看版本更新日志
git log [--pretty=oneline]       --可选参数显示简略信息

$ git log
commit cf3d291b043457536f5851c3517c94f6f50d4c94 (HEAD -> master, origin/master)
Author: wangy325 <wangy325@qq.com>
Date:   Wed Sep 19 12:11:13 2018 +0800

    update readme.md

commit 7daa43936419202cfd6c0e58988001577cb61e73
Author: wangy325 <wangy325@qq.com>
Date:   Wed Sep 19 12:10:30 2018 +0800

    upload files

上面的日志显示 HEAD 的版本号cf3d291b043457536f5851c3517c94f6f50d4c94,括号内显示,本地仓库和远程仓库的文件是一致的(最新的),以下是commit但是没有push到远程仓库的日志记录:

commit f67ec47c9df0f0f8351413ef64494e908d7183a0 (HEAD -> master)
Author: wangy325 <wangy325@qq.com>
Date:   Thu Sep 20 17:29:09 2018 +0800

    add motto

commit cf3d291b043457536f5851c3517c94f6f50d4c94 (origin/master)
Author: wangy325 <wangy325@qq.com>
Date:   Wed Sep 19 12:11:13 2018 +0800

    update readme.md

commit 7daa43936419202cfd6c0e58988001577cb61e73
Author: wangy325 <wangy325@qq.com>
Date:   Wed Sep 19 12:10:30 2018 +0800

    upload files

上面的日志显示,本地HEAD最新的版本号和远程仓库的版本号不一致,暗示本地仓库的改动还未提交到远程仓库

撤销修改
  1. modified 状态撤回

git checkout

从工作区和索引中删除文件

git rm [-f | --force] [-n] [-r] [–cached] [–ignore-unmatch] [–quiet] [–] …

  • git rm <file>

    从当前工作目录中删除文件,这个文件将会从***工作空间***物理删除,然后commit,版本库中的改文件信息会被删除

$ git rm text2.md
rm 'text2.md'

$ git status
On branch master
Your branch is ahead of 'origin/master' by 5 commits.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        deleted:    text2.md

$ git commit -m "aaa"
[master d0ba06d] aaa
 1 file changed, 1 deletion(-)
 delete mode 100644 text2.md
  • git rm -f <file>

    如果当前文件已经在暂存区,则将其从***暂存区***和***工作空间***中移除(移除版本信息),commit 之后,其将不在版本库中

$ git add t3.md
warning: LF will be replaced by CRLF in t3.md.
The file will have its original line endings in your working directory.

$ git rm t3.md
error: the following file has changes staged in the index:
    t3.md
(use --cached to keep the file, or -f to force removal)

$ git rm -f t3.md
rm 't3.md'

$ git status
On branch master
Your branch is ahead of 'origin/master' by 6 commits.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean
  • git rm --cached <file>

    如果当前文件改动已经add到暂存区,使用该命令从暂存区中移除版本信息,但是工作空间中还存在,commit之后,其将不在版本库中

$ git add t3.md
warning: LF will be replaced by CRLF in t3.md.
The file will have its original line endings in your working directory.

$ git rm --cached t3.md
rm 't3.md'

$ ls
me/  readme.md  t3.md

$ git status
On branch master
Your branch is ahead of 'origin/master' by 7 commits.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        deleted:    t3.md

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        t3.md

此文的操作背景在本次工作空间的master分支下, 并且追踪远程master分支
部分内容引用自yibai.com

前文说到, git版本控制的基本原型与操作逻辑. 如果出现两台机器(比如公司和家)上同时更改’本地仓库’内容并且push到远程库中,那么必然会导致另一个版本库中的文件低于远程库,如果是有效的改动, 必然涉及到本地库和远程库同步的问题, 这涉及到3个关键词: fetch, merge, pull

git fetch

从一个或多个其他存储库中获取分支和/或标签(统称为“引用”)以及完成其历史所必需的对象

通俗地讲, 如果想将远程仓库master分支的版本信息下载(同步)到本地仓库, 就可以简单地使用

$ git fetch origin master

命令. git fetch 命令会默认拉取所有分支信息. 但是仅仅这样, 本地的文件并没有更新, 因为这一操作仅仅’检查到有可用更新’, 要’更新’本地仓库工作空间的文件,还需要另一个命令: git merge

git merge

命令用于将两个或两个以上的开发历史加入(合并)一起

实际上, 在执行了git fetch origin master 之后, 再执行git branch, 会出现两个分支信息:

$ git fetch origin master
Warning: Permanently added the RSA host key for IP address '52.74.223.119' to the list of known hosts.
Enter passphrase for key '/c/Users/mayn/.ssh/id_rsa':
remote: Enumerating objects: 19, done.
remote: Counting objects: 100% (19/19), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 10 (delta 5), reused 10 (delta 5), pack-reused 0
Unpacking objects: 100% (10/10), done.
From github.com:wangy325/demoLite
 * branch            master     -> FETCH_HEAD
   276f33d..78beaa6  master     -> origin/master
$ git branch -a
* master
  remotes/origin/master

其中master分支是当前工作分支, 而remotes/origin/master是执行fetch命令之后下载的版本信息. 如果想将版本库中的分支合并到当前工作分支,可以使用命令:

$ git merge origin/master

注意:上述命令会自动将合并后的结果提交(commit), 如果想要对合并进行进一步更改时, 可以使用 --no-commit 选项

git pull

取回远程主机某个分支的更新(fetch),再与本地的指定分支合并(merge)

因此, pull可以看作是fetchmerge命令的集合, 如果想要将远程master分支与本地master分支合并, 可使用如下命令:

$ git pull origin master:master

如果当前工作分支是master分支, 那么命令也可以简写为:

$ git pull origin master

实际上我们发现, 以上命令相当于先取回origin/master分支, 再将其与当前分支合并, 这是一个先做git fetch, 后做git merge操作的过程:

$ git fetch origin master
$ git merge origin/master

分支追踪关系

一般地, Git会自动在本地分支和远程分支之间建立一种追踪关系(tracking). 建立追踪关系的分支之间可以建立更加简便的操作.

比如,在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动”追踪”origin/master分支

可以通过 git branch -vv 查看当前本地分支与远程分支的追踪关系:

$ git branch -vv
* master 78beaa6 [origin/master] revise code

也可以手动建立追踪关系:

// 将本地master分支与远程master分支建立追踪关系 
$ git branch --set-upstream master origin/master

建立追踪关系之后, git pull 就可以省略远程名, git 自动从当前分支追踪的远程分支中获取更新并且拉取到本地工作空间

// 现在自动从远程仓库(origin)中拉取当前分支追踪的远程分支的更新 
$ git pull origin
// 若当前分支只有一个追踪分支, 甚至可以省略主机名
$ git pull

git fetch和git pull的区别

  • git fetch : 从远程获取最新的版本到本地, 但是不会自动合并
  • git pull : 从远程获取最新版本并且合并到本地
// 从远程origin的master分支拉取最新版本到origin/master分支
$ git fetch origin master
// 比较本地master和origin/master分支的区别
$ git log -p master.. origin/master
// 合并 origin/master 到当前分支(master)
$ git merge origin/master

上述过程可以更加简便地表述为

$ git fetch origin master:tmp
$ git diff tmp 
$ git merge tmp
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术工厂 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读