Git 的简单使用

changelog

[update-2019-08-10]

[update-2020-02-29]

[update-2020-08-01]

前戏

下载安装 Git。

PS:Gitee、Github、Coding 这类 Git 协作管理工具原理都一样。

配置

全局配置

该配置是全局配置,对于不同的管理工具,只要用的一套邮箱和密码,都可以使用。

git config --global user.name "在 Github 等站的名字或昵称"
git config --global user.email "在 Github 等站注册使用的邮箱"

针对项目配置

需要在项目根目录下进行配置。

git config user.name "Your Name"

git config user.email "Your email"

注意:如果你配置了全局的用户名和邮箱,仍可以针对项目进行配置,Git 会优先考虑针对项目的配置,找不到才会去使用全局的配置。

查看当前配置

git config --list 查看当前配置

本地生成 SSH 公钥,并在 Github 等站配置

在配置好用户名和密码后,可以进行生成公钥。

为什么要配置 SSH 公钥

配置 SSH 公钥后,本地仓库与远程仓库可以通过 SSH 链接进行交互(pull,push 等操作)。

SSH 链接示例: git@github.com:hqweay/MarkAll.git

反过来说,如果你通过 SSH 链接关联远程仓库与本地仓库,就必须配置 SSH 公钥,才能进行 Git 操作。

另一方面,如果你通过 HTTPS 链接进行关联,你就无需配置 SSH 公钥。

HTTPS 链接示例:https://github.com/hqweay/MarkAll.git

若你通过 HTTPS 链接对本地仓库和远程仓库进行关联,在进行 push 操作时,Git 将会提示你手动输入密码以验证权限。

所以通过 SSH 与 HTTPS 链接关联远程仓库库与本地仓库的区别就显而易见了,通过 SSH 链接,一次配置后以后就无须重复输入密码,同时,不必输入密码,也在一定程度上保证了安全。

生成公钥

ssh-keygen -t rsa -C "xxxxx@xxxxx.com(你的邮箱)"

连续按三次回车,使用默认配置即可

查询公钥

cat ~/.ssh/id_rsa.pub

这一步是查询公钥,把显示的东西全复制下来即可。

如果操作系统是 Windows,可以打开 C:\用户\Users\.ssh\id_rsa.pub 文件查看公钥。

配置

然后把公钥粘贴到 Github 这类网站配置 SSH 公钥的的对应位置即可。

基本操作

  • git clone

    git clone git@github.com:hqweay/MarkAll.git<仓库链接>

  • git pull

    git pull orignmaster

  • git push

    git push originheng

PS:了解下 rmeote 概念就行了。

  • git merge

    git merge <想要合并到当前分支的分支名>

其它

  • git init
  • git remote
  • git branch

提交

  • git add .
  • git commit -m""
  • git push

常用命令

将本地库与远程库关联

git remote add origin git@github.com:hqweay/MarkAll.git

origin 为本地库的关联名

一个本地库关联多个远程库,就是通过更改 origin 这一项的名字实现的。

比如:

git remote add One git@github.com:hqweay/MarkAll.git

git remote add Two git@github.com:hqweay/MarkAll.git

就实现了一个本地库关联两个远程项目,需要进行操作时便分别通过名称One,Two来操作。

关联其它操作

删除关联 git remote rm origin

查询关联 git remote -v

clone 某分支

默认克隆 master 到本地:git clone git@github.com:hqweay/MarkAll.git

回退到某版本

  1. 使用 git log 命令查看所有的历史版本,获取某个历史版本的 id,假设查到历史版本的 id 是 139dcfaa558e3276b30b6b2e5cbbb9c00bbdca96。
  2. git reset –hard 139dcfaa558e3276b30b6b2e5cbbb9c00bbdca96
  3. 把修改(强制)推到远程服务器git push -f origin master

强制 push

git push -f origin master

设置默认仓库

以命令 git push -f -u origin master 为例。

其中 -f 是命令 --force 的缩写,意味着忽略冲突,将本地的内容强制推送,覆盖远程仓库。

-u 的意思是把当前使用的仓库 origin master 设置为默认仓库。

设为默认仓库后,下次就只需要操作 git push 而无需输入全部命令 git push origin master 达到推送的效果。

同步云端代码至本地

git pull origin 分支名

其他

  • 删除本地某次 commit(比如最近一次不小心把 密码 add 了)
  • 删除线上某次 commit

Merge 操作

场景

假如本地仓库有一个分支 master 对应远程仓库的一个分支 master。

现在需要将远程仓库的另一个名为 master-new 的分支 merge 到本地分支 master。

操作

// 新建分支

git branch add master-new

// 切换到该分支

git checkout master-new

// 此时新建的分支还未与远程分支关联

// 把远程分支 pull 回来 默认就关联了

git pull origin<remote> master-new<远程仓库名>

// 切回原分支

git checkout master

// 把新分支的内容 merge 回来

git merge master-new

// 然后按照冲突进行解决即可

注意

如果要将远程仓库的一个分支 merge 到本地,需要保证远程分支的 commit 是较新的版本。

新到那种程度?

新于本地分支和被 merge 的分支的主干分支。

其他命令

查看项目的分支们(包括本地和远程)
命令行 : $ git branch -a

删除本地分支

$ git branch -d <BranchName>

fetch

1
2
3
4
5
6
7
8
$ git fetch origin master:temp
$ git diff temp
$ git merge temp
$ git branch -d temp

$ git fetch origin master
$ git log -p master..origin/master
$ git merge origin/master

submodule

添加

1
git submodule add <url> <path>

使用

克隆父项目后,默认子模块目录下无任何内容。需要在项目根目录执行如下命令完成子模块的下载:

1
2
git submodule init
git submodule update

或:

1
git submodule update --init --recursive

更新

进入子模块的目录下 git pull

删除

有时子模块的项目维护地址发生了变化,或者需要替换子模块,就需要删除原有的子模块。

1
2
3
4
rm -rf 子模块目录 # 删除子模块目录及源码
vi .gitmodules # 删除项目目录下.gitmodules文件中子模块相关条目
vi .git/config # 删除配置项中子模块相关条目
rm .git/module/* # 删除模块下的子模块目录,每个子模块对应一个目录,注意只删除对应的子模块目录即可

执行完成后,再执行添加子模块命令即可,如果仍然报错,执行如下:

操作完在执行git rm --cached 子模块名称 前,需要先提交一下更新。

1
git rm --cached 子模块名称

使用 GIthub 的网络问题

科学上网

使用镜像

  • https://github.com.cnpmjs.org/

    如命令 git clone https://github.com/hqweay/MarkAll.git 可以用 git clone https://github.com.cnpmjs.org/hqweay/MarkAll.git 代替。

改 DNS

骚操作

使用 Gitee 等将 Github 的仓库同步过来,然后通过 Gitee 等提供的链接 clone 仓库。

【可能失效】一些坑

修改代码后 push 失败

(协作项目其他人已取得管理权限等同理…)

Authentication failed for “https://gitee.com…”

输入账号密码登录,出现这类报错。

PS:仓库以 https 关联就可能出现这个错,搜索到的解决方式是建议用 SSH 关联。

使用 SSH 公钥可以让你在你的电脑和码云通讯的时候使用安全连接(Git 的 remote 要使用 SSH 地址)
gitee官方说明

以 https 方式克隆下来的仓库默认以 https 方式与仓库关联,故应当重新关联。
先查询

git remote -v
若为

origin https://gitee.com/hqweay/BookShopping.git (fetch)
origin https://gitee.com/hqweay/BookShopping.git (push)

这类信息,则说明为 https 关联。

先删除关联

git remote rm 关联库名

查询是否删除成功

git remote -v
//无信息则说明删除关联成功

再用 SSH 链接绑定,

git remote add origin git@gitee.com:hqweay/BookShopping.git

查询,若信息为

origin git@gitee.com:hqweay/BookShopping.git (fetch)
origin git@gitee.com:hqweay/BookShopping.git (push)

则用 SSH 链接关联成功,尝试 push 一下。

push 不成功

push 不成功还有可能是 gitee 项目(远程仓库)中有本地项目不存在的文件,比如建立 gitee 项目时引入了 readme.md

git pull –rebase origin master

执行该命令,让远程仓库代码合并到本地。

再执行 push

提示本地项目没有文件

执行push命令前需要

git add .

git commit -m “提交说明”