27

Git 实用基础(配置,建库,提交,推送 GitHub)

 3 years ago
source link: http://www.cnblogs.com/l1ng14/p/13652966.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Git 实用基础(配置,建库,提交,推送 GitHub)

SVN ? Git ?

目前市面上主流的版本控制系统就是 SVN 和 Git 。

两者的区别简单通俗地说就是,版本数据是否有在本地。

如果觉得不够简单通俗,直接上图:

SCzd1XayOZBoktp.png

这是 SVN ,显然是一种集中式的版本控制系统,主要的版本数据全部保存在服务器。

  • 本地用户只有自己以前同步过的版本,如果不联网,用户是看不到未同步过的历史版本的。
  • 提交需要连接服务器(非本地版本库),也需要写权限。
  • 管理员灵活可以掌控开发人员的读、写、修改目录等权限。
  • 提交并非每次都会成功,因为你的同事可能比你早提交,那么会提示“改动基于过时的版本,先更新再提交”… 诸如此类,你基于以前版本修改得到的新版本就无法提交(干活不快不行的啊)。
  • 当提交的慢时,又同时对同一文件进行操作时,就会出现冲突,冲突解决是一个提交速度的竞赛:手快者,先提交,平安无事;手慢者,后提交,可能遇到麻烦的冲突解决。
  • 因为工作时很多时刻都要跟服务器进行同步或者解决冲突,这样每个参与开发的人员都可以看到团队的人员做了些什么工作。你提交的慢,提交失败的时候,再去同步下来的代码,或者解决冲突时,你可以看到你的同事新做了哪些工作。
  • 一个致命的缺陷:一旦中央服务器有宕机等故障,全员无(dai)法(xin)工(xiu)作(jia),所有人都无法提交,同步,个人修改了代码也只是在个人本地上,如果服务器无法使用时间过长,开发人员此前还一直在进行修改相同文件的工作,等服务器好了,就是提交速度的比拼,求最后提交的社畜的心理阴影面积。

经过上面的描述,可以知道, SVN 的本质就是,只关心文件的具体内容差异,那些文件做了更新,做了哪些更新。

Git ,就是针对 SVN 的以上这一致命缺陷,做出了它的特色。

Qt792AxPInhMEza.png

Git 更多的只关心文件数据的整体是否发生变化。Git 不保存文件内容前后变化的差异数据。

实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一连接。

在分布式版本控制系统中,客户端并不只提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。这类系统都可以指定和若干不同的远端代码仓库进行交互。籍此,你就可以在同一个项目中,分别和不同工作小组的人相互协作。你可以根据需要设定不同的协作流程。

另外,因为Git在本地磁盘上就保存着所有有关当前项目的历史更新,并且Git中的绝大多数操作都只需要访问本地文件和资源,不用连网,所以处理起来速度飞快。用SVN的话,没有网络或者断开VPN你就无法做任何事情。但用Git的话,就算你在飞机或者火车上,都可以非常愉快地频繁提交更新,等到了有网络的时候再上传到远程的镜像仓库。换作其他版本控制系统,这么做几乎不可能,抑或是非常麻烦。

  • Git中每个克隆(clone)的版本库都是平等的。你可以从任意一版本库的克隆来创建属于你自己的版本库,同时你的版本库也可以作为源提供给他人,只要你愿意。在 GitHub 上也是如此。
  • Git的每一次提取操作,实际上都是一次对代码仓库的完整备份。
  • 提交完全在本地完成,无须别人给你授权,你的版本库你作主,并且提交总是会成功。在你的本地版本库,是不存在冲突这一说法的,只有旧版本和新版本的更新问题。甚至基于旧版本的改动也可以成功提交,提交会基于旧的版本创建一个新的分支。
  • PUSH 给他人或者他人 PULL 你的版本库,合并会发生在 PULL 和 PUSH 过程中,不能自动解决的冲突会提示手工完成。冲突解决不再像是SVN一样的提交竞赛,而是在需要的时候才进行合并和冲突解决。
  • Git 可以模拟集中式的工作模式,Git版本库也是统一放在服务器中的。
  • Git 版本库可以为开发人员进行授权:创建版本库,向版本库 PUSH,够读取(克隆)版本库的权限,像 GitHub 上就有 private 私有库,对外不可见,只有自己拥有对于该库的所有权限。
  • 开发人员先将服务器的版本库克隆到本地;并经常的从服务器的版本库拉(PULL)最新的更新;完成工作后,将自己的改动推(PUSH)到服务器的版本库中,当其他人和版本库同步(PULL)时,会自动获取到更新。
  • 开发人员在脱离 Git 服务器所在网络的情况下,如移动办公/出差时,可以照常使用代码库;只需要在能够接入Git服务器所在网络时, PULL 和 PUSH 即可完成和服务器同步以及提交。
  • Git提供 rebase 命令,可以让你的改动看起来是基于最新的代码实现的改动。
  • Git 有更多的工作模式可以选择,这也是 Git 成为当下最流行的版本控制系统的原因。

具体更多差异可以参考 SVN与Git比较的优缺点差异

Git !Git 配置

查看配置

$ git config -l

所有相关配置都可以在此查看:

JGI8T5a29LXPhFA.png

查看不同级别的配置:

# 查看系统级别的配置文件
$ git config --system --list
# 查看当前用户的配置文件
$ git config --global --list

其中系统级别的配置文件在 Git\etc\gitconfig :Git 安装目录下的 gitconfig 文件下:

BsFZtV1MuJRYCTQ.png

当前用户级别的配置文件在 C:\Users\Administrator\ .gitconfig ,只适用于当前登录用户的配置:

jJDoaxK8TRL9QCh.png

配置当前用户

# 名称
$ git config --global user.name "l1ng14"  
#邮箱
$ git config --global user.email [email protected]

配置用户表示是十分必要的

当你安装Git后首先要做的事情是设置你的用户名称和e-mail地址。这是非常重要的,因为每次Git提交都会使用该信息。它被永远的嵌入到了你的提交中.

只需要做一次这个设置,如果你传递了--global 选项,因为Git将总是会使用该信息来处理你在系统中所做的一切操作。如果你希望在一个特定的项目中使用不同的名称或e-mail地址,你可以在该项目中运行该命令而不要--global选项。总之--global为全局配置,不加为某个项目的特定配置。

Git 工作流程

总的来说,Git 分为四个工作区域:

ecJBgQnui1Lor63.png

  • Working Directory :工作区,本地项目工程所在的区域。
  • Stage ( Index ) :暂存区,有临时改动可以通过一下命令保存到暂存区:
# add . :表示将工作区的所有文件都保存到暂存区
$ git add .
  • Repository(Local Repository ) :仓库区(本地仓库),安全存放版本数据的地方,这里保存有提交过的版本数据,其中 Head 只想最新提交到本地仓库的版本。
    • 本地仓库有两种方法进行创建:
  1. 创建全新的本地仓库

在需要用 Git 管理的项目的根目录下,使用 Git Bash 命令行执行操作:

$ git init
  1. 克隆远程仓库

克隆远程服务器的仓库到本地, 相当于将远程服务器上的仓库完全镜像一份到本地,可以使 gitee 或者 github 上的仓库。

在适合的文件夹下,使用 Git Bash 命令行执行操作:

$ git clone https://github.com/L1ng14/Hello-World.git

提交需要使用以下命令:

# 提交到本地仓库
$ git commit -m "提交信息"
  • Remote (Remote Repository ) :远程仓库,在进行托管的服务器上,工作上的改动通常需要进行提交到远程仓库中,和他人进行协同开发。通常要进行
# 拉取项目到本地仓库
$ git pull
# 推送项目到远程仓库
$ git push

使用 GitHub 远程仓库

  1. 首先在本地生成 SSH 密钥。在 C:\Users\Administrator\.ssh 目录下
$ ssh-keygen -t rsa

rsa : 使用rsa算法进行加密,执行后,会在/home/当前用户/.ssh目录下找到id_rsa(私钥)和id_rsa.pub(公钥)

fdipzone@ubuntu:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/Administrator/.ssh/id_rsa): 这里输入要生成的文件名
Enter passphrase (empty for no passphrase):                       这里输入密码 
Enter same passphrase again:                                      这里重复输入密码
Your identification has been saved in /c/Users/Administrator/.ssh/id_rsa.
Your public key has been saved in /c/Users/Administrator/.ssh/id_rsa.pub.
The key fingerprint is:
f2:76:c3:6b:26:10:14:fc:43:e0:0c:4xxxxxxxxxxxxxxxxxxxxxxxx
The key's randomart image is:
+--[ RSA 2048]----+
|    .+=*..       |
|  .  += +        |
|   o oo+         |
|  E . . o        |
|      ..S.       |
|      .o .       |
|       .o +      |
|       ...oo     |
|         +.      |

yTuiK3nfSDXOlEg.png

  1. 添加密钥到 GitHub 账号中:

4jaf3Soc1tMrVJl.png

  1. 在 GitHub 上新建远程仓库

    ZkxbftnBICyHzVe.png

    相关配置根据自己的喜好设定好。

  2. 拉取远程仓库的镜像到本地

pPI1L475HX8tK9G.png

在自建的远程仓库的中复制得到该仓库的 URL。在适合的文件夹下,使用 Git Bash 命令行执行操作:

$ git clone https://github.com/L1ng14/Hello-World.git

拉取成功后,在仓库文件夹下会出现:

g7PouvAnhHbYqf3.png

结合 IDEA 提交到 GitHub

新建项目绑定 Git

需要 push 目标工程到 GitHub 上的目标远程仓库,这里分2种情况:

1. 已经在 GitHub 建好仓库

这里也介绍两种方法:

1.1 文件复制

$ git clone "仓库的 URL"

g7PouvAnhHbYqf3.png

直接选取全部文件复制到目标工程的目录下

回到 IDEA 打开工程,工程上会出现:

ZtkSaYum5wG7DBP.png

这时候可以使用前面介绍到的命令进行添加,提交,推送

# 添加到暂存区
$ git add .
# 提交到本地仓库
$ git commit -m "提交信息"
# 推送到远程仓库
$ git push

之后刷新远程仓库(GitHub 仓库页面),就可以看到目标项目已经提交到远程仓库中。

1.2 命令行

别忘了,前提条件是已经有一个空的远程仓库

# 初始化本地仓库
$ git init
# 添加全部文件到暂存区
$ git add .
# 提交到本地仓库
$ git commit -m "提交信息"
# 绑定远程仓库,并给远程仓库取一个别名,通常用origin,后接远程仓库的URL地址
$ git remote add origin "远程仓库URL"
# 推送到远程仓库
$ git push origin master

这时候好不能正常地使用 git push 进行推送到远程仓库的主分支。因为本地的分支没有和远程分支建立联系,需要输入:

$ git push --set-upstream origin master

2S5EFlUzdR3Z6ao.png

之后就可以正常使用 git push 进行推动到远程仓库了。

2. GitHub 上没建仓库

用图形界面操作:

用 IDEA 打开目标项目,先在本地建立一个本地仓库,有利于后面进行添加,提交操作

JKrEo2ikFLeW6vY.png

同上命令进行添加,提交。别忘了排除文件

排除文件

在项目根目录下,文件 .gitignore 用于排除不需要进行版本控制的文件。

HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/

#自定义排除
/.mvn/
mvnw
mvnw.cmd

### VS Code ###
.vscode/

排除的文件在 IDEA 中会变灰色。

l3ZCE7FiGH1y2rs.png

点击分享项目到 GitHub。

yPoaNElO6LjBGsI.png

填写相关信息:

BcoCjeFtmaZuqAD.png

点击 Share ,GitHub 会自动建立一个远程仓库,并首次推送目标项目。

相关问题解决方案

Updates were rejected because the remote contains work that you do not have locally.

具体提示:Updates were rejected because the remote contains work that you do not have locally. This is usually caused by another repository pushing to the same ref. You may want to first integrate the remote changes (e.g., 'git pull ...') before pushing again. See the 'Note about fast-forwards' in 'git push --help' for details.

6BA8v54acrlMSHw.png

问题原因: 本地基于的修改版本不是远程仓库的源版本,需要先 pull 下来远程仓库的源版本。

$ git pull origin master

lnQCBrU1ZE4h76q.png

这时候,本地和远程仓库的头版本就保持一致了,同时此前本地的修改还保留在本地,这时候,在 push 就应该没问题了。

$ git push

1glxG8c2QyEk7VT.png

删除已提交的忽略文件

如果一次提交后,忘记配置忽略文件夹或者文件,导致需要忽略的文件被提交到远程仓库中,如 Github 上。

因为 Github 上是不支持删除文件夹或者文件的,这时候即使,后面面配置了忽略该文件夹或者文件,远程仓库中依然会保有该文件夹或者文件。

以 .idea 文件夹为例,这时候需要用到命令:

$ git rm -r --cached .idea

--cached :只删除远程仓库中的对应文件夹或者文件。

push 之前别忘了提交:

$ git commit -m "提交信息"
$ git push

不用担心误删的情况发生,执行命令后,会有一系列提示,remove 或者删除了哪些文件夹、文件。

强行覆盖已有仓库

# 强制提交到远程仓库,会强制覆盖
$ git push [email protected]:L1ng14/test.git master -f

UYseGRyVHTqQ7ni.png

别忘了这样做的重要前提:已经在 GitHub 建好一个远程仓库,并且你已经决定覆盖它

cannot load information for github.com

nlhNeMcLHVjQgw2.png

通过图形界面分享工程到 GitHub 的时候会出现以上错误,可以通过增大超时时间进行解决;

2Y6UVrMFT8nNmSs.png

但是毕竟有 qiang。增大后有时候还是会超时,建议还是先在 GitHub 建好库。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK