【Geek之路】Git使用手册

Posted by ShawnD on January 8, 2020

账号相关

git config user.name “your name”
git config user.email “your email”

这里的名字和邮箱仅用于显示提交

如果是自己的机器可以加上–global参数。

版本控制

初始化仓库

git init

添加文件

git add xxx.txt
git commit -m “modify sth”

查看历史记录

git log

检查下修改了什么内容

git status

git删除已经add的文件

当git add 某个文件到缓存区,还没有git commit 但是你不想这个文件了

就可以使用git rm命令,两种选择:

  1. git rm –cached “文件路径”,不删除物理文件,仅将该文件从缓存中删除;
  2. git rm –f “文件路径”,不仅将该文件从缓存中删除,还会将物理文件删除(不会回收到垃圾桶)。

git删除已经add的文件的两种方法:

  • 用版本库内容清空暂存区,git reset HEAD (谨慎使用)

  • 只把特定文件从暂存区删除,git rm –cached xxx

git 删除历史commit

回滚上一次提交

git reset –hard HEAD^

回滚master分支的上一次提交。

删除远程仓库的文件或文件夹

git rm -r –cached 文件夹名称

git commit -m ‘delete 文件夹名称 dir’

git push -u origin master

.gitignore

.gitignore文件,这个文件的作用就是告诉Git哪些文件不需要添加到版本管理中

1
2
3
/mtk/ 过滤整个文件夹
*.zip 过滤所有.zip文件
/mtk/do.c 过滤某个具体文件
  • 以斜杠/开头表示目录;
  • 以星号*通配多个字符;
  • 以问号?通配单个字符
  • 以方括号[]包含单个字符的匹配列表;
  • 以叹号!表示不忽略(跟踪)匹配到的文件或目录;

一次 git add 所有修改

git add .

分支

创建分支

git checkout -b dev

查看当前分支

git branch \

  • dev
    master

git branch命令会列出所有分支,当前分支前面会标一个*号。

git brach -a

显示所有分支

切换分支

git checkout master

切换回master分支

合并分支

git merge dev

git merge命令用于合并指定分支到当前分支。

删除分支

git branch -d dev

解决分支冲突

当产生dev分支更改之后,master分支也进行了修改, 如下图所示

这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突

这种情况下,我们必须修改后(不修改也可以,冲突的部分都保留),然后add+commit

git add readme.txt
git commit -m “conflict fixed”

现在,master分支和feature1分支变成了下图所示:

这条绿线我认为画得是不合理的,因为dev分支git log发现, 并不显示绿色的部分。

##

远程仓库

生成SSH key

ssh-keygen -t rsa -C “xxx@gmail.com”

邮箱换成自己的!

本地仓库连接远程仓库

在本地产生SSH key, 将公钥绑定在github上

添加远程库

git remote add origin git@github.com:xxx/***.git

xxx为账户名称,***为仓库名称

origin可以改成自己想要的名字

出现报错

fatal: refusing to merge unrelated histories

出现这个问题的最主要原因还是在于本地仓库和远程仓库实际上是独立的两个仓库 发现可以在pull命令后紧接着使用–allow-unrelated-history选项来解决问题(该选项可以合并两个独立启动仓库的历史)

git pull origin master --allow-unrelated-histories

将本地版本库的分支推送到远程服务器

git push -u origin master

查看项目远程地址

git remote -v

git拉取远程代码到本地

1> 初始化git

git init

2.> 和远程仓库链接

git remote add origin+地址

3> 把远程仓库的分支代码拉取到本地

git fetch origin develop(develop是远程仓库分支名称)

4> 在本地创建分支dev(随便起名)并切换到该分支

git checkout -b dev origin/develop

5> 把远程develop分支上的代码拉取到本地

git pull origin develop

远程分支和本地分支的解释

github上已经有master分支 和 dev分支

1> 克隆代码

git clone https://github.com/master-dev.git

这个git路径是无效的,示例而已

2> 查看所有分支

git branch –a

默认只有master分支,所以会看到如下两个分支 master[本地主分支] origin/master[远程主分支] 新克隆下来的代码默认master和origin/master是关联的,也就是他们的代码保持同步

3> 创建本地新的dev分支

创建本地分支

git branch dev

查看分支

git branch

这时会看到master和dev,而且master上会有一个星号。

这个时候dev是一个本地分支,远程仓库不知道它的存在。

本地分支可以不同步到远程仓库,我们可以在dev开发,然后merge到master,使用master同步代。

当然也可以同步到远程仓库。

4> 发布dev分支

发布dev分支指的是同步dev分支的代码到远程服务器

git push origin dev:dev # 这样远程仓库也有一个dev分支了

5> 在dev分支开发代码

git checkout dev # 切换到dev分支进行开发

开发代码之后,我们有两个选择

第一个:如果功能开发完成了,可以合并主分支

git checkout master # 切换到主分支

git merge dev # 把dev分支的更改和master合并

git push # 提交主分支代码远程

git checkout dev # 切换到dev远程分支

git push # 提交dev分支到远程

第二个:如果功能没有完成,可以直接推送

git push # 提交到dev远程分支

6> 删除分支

git push origin :dev # 删除远程dev分支,危险命令哦

下面两条是删除本地分支

git checkout master # 切换到master分支

git branch -d dev # 删除本地dev分支

Git API

git rebase

假设Git目前只有一个分支master。开发人员的工作流程是

  • git clone master branch
  • 在自己本地checkout -b local创建一个本地开发分支

Github Docs

GitHub 流程

  • 从仓库创建分支。
  • 创建、编辑、重命名、移动或删除文件。
  • 从您的分支发送 pull 请求,让您提议的更改引发讨论。
  • 根据需要在您的分支上进行更改。 您的pull request 将自动更新。
  • 在分支处理就绪,可以 merge 时,merge pull request。
  • 使用pull request 中或分支页面上的删除按钮,整理您的分支。

创建和删除仓库中的分支

创建分支

1> 在 GitHub 上,导航到仓库的主页面。

2> (可选)如果要从仓库的默认分支以外的分支创建新分支,请单击 NUMBER 分支,然后选择另一个分支:

3> 单击分支选择器菜单。

4> 为新分支键入唯一名称,然后选择 Create branch(创建分支)。

删除分支

您可让 master 分支在仓库中的 pull request merge后自动删除。

注意:如果要删除的分支是仓库的默认分支,则在删除该分支之前必须选择新的默认分支。

如果要删除的分支与打开的拉取请求关联,则在删除该分支之前必须合并或关闭拉取请求。

1> 在 GitHub 上,导航到仓库的主页面。

2> 在文件列表上方,单击 NUMBER 分支。

3> 滚动到要删除的分支,然后单击 删除。

如果您在pull request merge后删除master分支,GitHub 会检查将已删除分支指定为基础分支的同一仓库中的任何开放拉取请求。 GitHub 将自动更新任何此类拉取请求,将其基础分支更改为合并的拉取请求的基础分支。

关于 pull request

Pull requests让你告诉其他人你已经推送到GitHub存储库中的分支上的更改。一旦打开了pull请求,您就可以与协作者讨论和审查潜在的更改,并在更改合并到基本分支之前添加后续提交。

Note: 在处理pull请求时,请记住以下几点:

  • 如果您使用的是共享存储库模型,我们建议您为pull请求使用 topic 分支。虽然您可以从任何分支或提交发送pull请求,但如果需要更新建议的更改,您可以使用topic分支推送后续提交。
  • 当push提交到pull请求时,不要强制push。强制push会破坏你的pull请求。

在初始化一个pull请求之后,您将看到一个审查页面,其中显示了您的分支(compare分支)和存储库的基本分支之间更改的高级概述。您可以添加提议变更的摘要,审查提交所做的变更,添加label、milestone和assignees,以及@mention单个贡献者或团队。

创建 pull request

创建pull request 来向一个仓库 propose 和 collaborate 更改。 这些更改是在一个分支中提出的,这将确保默认的分支只包含完成的和批准的工作。

任何对仓库具有读权限的人都可以创建pull请求,但创建分支必须具有写权限。如果你想为你的pull请求创建一个新的分支,并且没有对存储库的写权限,你可以先fork存储库。

当你创建pull请求时,你可以指定你想将你的变更合并到哪个分支。

更改分支范围和目标仓库

默认情况下,pull请求基于父仓库的默认分支。如果默认的父仓库不正确,您可以通过下拉列表更改父仓库和分支。您还可以用下拉列表交换您的head和base braches,以建立reference points之间的diff。

在考虑分支时,请记住base分支是应该应用更改的地方,head分支包含base分支中您希望应用的内容。

当您更改base仓库时,您还更改了pull请求的通知。每个能够推送到 base仓库 的人都将收到一封电子邮件通知,并在下次登录时在dashboard中看到新的pull请求。

创建pull request

你也可以使用GitHub Desktop来创建一个pull请求。

1> 在GitHub上,到仓库的主页。

2> 在“Branch”菜单中,选择包含提交的分支。

3> 在文件列表上方,单击Pull request。

4> 使用base branch下拉菜单选择您想要合并更改的分支,然后使用compare branch下拉菜单选择您进行更改的主题分支。

5> 为你的请求输入一个标题和描述。

6> 要创建一个可以检查的拉请求,单击create pull request。如果需要创建一个“Draft Pull Request ”,可以通过下拉菜单选择“Create Draft Pull Request”,然后单击“Draft Pull Request”。

提示:在创建pull request之后,您可以请特定的人检查您提出的更改。

从fork创建一个pull request

你可以创建一个pull请求来propose你对 upstream 仓库的一个分支所做的更改。

任何对仓库有写访问权的人都可以从用户拥有的fork创建pull请求。

1> 到创建fork的原始仓库。

2> 在文件列表上方,单击“Pull request”。

3> 在 Compare 页面上,单击 compare across forks。

4> 在“base branch”下拉菜单中,选择您想要merge变 更的upstream 仓库的分支。

5> 在“head fork”下拉菜单中,选择您的分支,然后使用“compare branch”下拉菜单选择您进行更改的分支。

6> 为你的请求输入一个标题和描述。

7> 在用户拥有的forks上,如果你不想让任何人通过推送访问upstram仓库来修改你的pull请求,那么取消选择“Allow edits from maintainers”。

8> 要创建一个可以检查的拉请求,单击create pull request。如果需要创建一个“draft pull request”,可以通过下拉菜单选择“ Create Draft Pull Request”,然后单击“Draft Pull Request”。

关于远程仓库

远程 URL 是 Git 一种指示“您的代码存储位置”的绝佳方式。 该 URL 可能是您在 GitHub 上的仓库,也可以是另一个用户的复刻,甚至在完全不同的服务器上。

您只能推送到两类 URL 地址:

  • HTTPS URL,如 https://github.com/user/repo.git
  • SSH URL,如 git@github.com:user/repo.git

Git 将远程 URL 与名称相关联,您的默认远程通常名为 origin。

创建远程

您可以使用 git remote add 命令将远程 URL 与名称匹配。 例如,在命令行中输入以下命令:

1
git remote add origin  <REMOTE_URL> 

这会将名称 origin 与 REMOTE_URL 关联。

您可以使用命令 git remote set-url 来更改远程 URL。

更改远程仓库的 URL

git remote set-url 命令可更改现有远程仓库的 URL。

git remote set-url 命令使用两个参数:

  • 现有远程仓库的名称。 例如,源仓库或上游仓库是两种常见选择。
  • 远程仓库的新 URL。 例如:
    • 如果您要更新为使用 HTTPS,您的 URL 可能如下所示:https://github.com/USERNAME/REPOSITORY.git
    • 如果您要更新为使用 SSH,您的 URL 可能如下所示:git@github.com:USERNAME/REPOSITORY.git

将远程 URL 从 SSH 切换到 HTTPS

1> 打开 Terminal(终端)。

2> 将当前工作目录更改为您的本地仓库。

3> 列出现有远程仓库以获取要更改的远程仓库的名称。

1
2
3
$ git remote -v
> origin  git@github.com:USERNAME/REPOSITORY.git (fetch)
> origin  git@github.com:USERNAME/REPOSITORY.git (push)

4> 使用 git remote set-url 命令将远程的 URL 从 SSH 更改为 HTTPS。

1
$ git remote set-url origin https://github.com/USERNAME/REPOSITORY.git

5> 验证远程 URL 是否已更改。

1
2
3
4
$ git remote -v
# Verify new remote URL
> origin  https://github.com/USERNAME/REPOSITORY.git (fetch)
> origin  https://github.com/USERNAME/REPOSITORY.git (push)

下次对远程仓库执行 git fetch、git pull 或 git push 操作时,您需要提供 GitHub 用户名和密码。 当 Git 提示您输入密码时,请输入您的个人访问令牌 (PAT)。 基于密码的身份验证对 Git 已弃用,使用 PAT 更安全。

将远程 URL 从 HTTPS 切换到 SSH

1> 打开 Terminal(终端)。

2> 将当前工作目录更改为您的本地仓库。

3> 列出现有远程仓库以获取要更改的远程仓库的名称。

1
2
3
$ git remote -v
> origin  https://github.com/USERNAME/REPOSITORY.git (fetch)
> origin  https://github.com/USERNAME/REPOSITORY.git (push)

4> 使用 git remote set-url 命令将远程的 URL 从 HTTPS 更改为 SSH。

1
$ git remote set-url origin git@github.com:USERNAME/REPOSITORY.git

5> 验证远程 URL 是否已更改。

1
2
3
4
$ git remote -v
# Verify new remote URL
> origin  git@github.com:USERNAME/REPOSITORY.git (fetch)
> origin  git@github.com:USERNAME/REPOSITORY.git (push)

重命名远程仓库

使用 git remote rename 命令可重命名现有的远程。

git remote rename 命令使用两个参数:

  • 现有的远程名称,例如 origin
  • 远程的新名称,例如 destination

示例

以下示例假设您使用 HTTPS 克隆,即推荐使用的方法。

1
2
3
4
5
6
7
8
9
10
11
12
$ git remote -v
# 查看现有远程
> origin  https://github.com/OWNER/REPOSITORY.git (fetch)
> origin  https://github.com/OWNER/REPOSITORY.git (push)

$ git remote rename origin destination
# 将远程名称从 'origin' 更改为 'destination'

$ git remote -v
# 验证远程的新名称
> destination  https://github.com/OWNER/REPOSITORY.git (fetch)
> destination  https://github.com/OWNER/REPOSITORY.git (push)

删除远程

使用 git remote rm 命令可从仓库中删除远程 URL。

git remote rm 命令使用一个参数:

  • 远程名称,例如 destination

示例

以下示例假设您使用 HTTPS 克隆,即推荐使用的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ git remote -v
# 查看当前远程
> origin  https://github.com/OWNER/REPOSITORY.git (fetch)
> origin  https://github.com/OWNER/REPOSITORY.git (push)
> destination  https://github.com/FORKER/REPOSITORY.git (fetch)
> destination  https://github.com/FORKER/REPOSITORY.git (push)

$ git remote rm destination
# 删除远程
$ git remote -v
# 验证其已删除
> origin  https://github.com/OWNER/REPOSITORY.git (fetch)
> origin  https://github.com/OWNER/REPOSITORY.git (push)

推送提交到远程仓库

使用 git push 将本地分支上的提交推送到远程仓库。

git push 命令使用两个参数:

  • 远程命令,如 origin
  • 分支名称,如 main

例如:

1
git push  <REMOTENAME> <BRANCHNAME> 

例如,您通常运行 git push origin main 来推送本地更改到在线仓库。

重命名分支

要重命名分支,同样使用 git push 命令,但要加上一个或多个参数:新分支的名称。 例如:

1
git push  <REMOTENAME> <LOCALBRANCHNAME>:<REMOTEBRANCHNAME> 

这会将 LOCALBRANCHNAME 推送到 REMOTENAME,但其名称将改为 REMOTEBRANCHNAME。

处理“非快进”错误

如果仓库的本地副本未同步或“落后于”您推送到的上游分支,您会收到一条消息表示:non-fast-forward updates were rejected。 这意味着您必须检索或“pull”上游更改,然后才可推送本地更改。

推送标记

默认情况下,没有其他参数时,git push 会发送所有名称与远程分支相同的匹配分支。

要推送单一标记,可以发出与推送分支相同的命令:

1
git push  <REMOTENAME> <TAGNAME> 

要推送所有标记,可以输入命令:

1
git push  <REMOTENAME> --tags

删除远程分支或标记

删除分支的语法初看有点神秘:

1
git push  <REMOTENAME> :<BRANCHNAME> 

请注意,冒号前有一个空格。 命令与重命名分支的步骤类似。 但这里是告诉 Git 不要推送任何内容到 REMOTENAME 上的 BRANCHNAME。 因此,git push 会删除远程仓库上的分支。

远程和复刻

在克隆您拥有的仓库时,向其提供远程 URL,告知 Git 到何处提取和推送更新。 如果要协作处理原始仓库,可添加新的远程 URL(通常称为 upstream)到本地 Git 克隆:

1
git remote add upstream  <THEIR_REMOTE_URL> 

现在可以从其复刻提取更新和分支:

1
2
3
4
5
6
7
8
git fetch upstream
# Grab the upstream remote's branches
> remote: Counting objects: 75, done.
> remote: Compressing objects: 100% (53/53), done.
> remote: Total 62 (delta 27), reused 44 (delta 9)
> Unpacking objects: 100% (62/62), done.
> From https://github.com/octocat/repo
>  * [new branch]      main     -> upstream/main

Git-LFS

Git LFS 是 Github 开发的一个 Git 的扩展,用于实现 Git 对大文件的支持

使用目的

在游戏开发过程中,设计资源占用了很大一部分空间. 像png,psd等文件是二进制(blob)的,体积也很庞大.

但git的diff/patch等是基于文件行的.对于二进制文件来说. git需要存储每次commit的改动.

每次当二进制文件修改,发生变化的时候. 都会产生额外的提交量.导致clone和pull的数据量大增.在线仓库的体积也会迅速增长.

LFS(Large File Storage) 就是为了解决这一问题而产生的工具.

它将你所标记的大文件保存至另外的仓库,而在主仓库仅保留其轻量级指针.

那么在你检出版本时,根据指针的变化情况下更新对应的大文件.而不是在本地保存所有版本的大文件

安装

Linux

1
sudo apt install curl
1
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
1
sudo apt-get install git-lfs
1
git lfs install

git报错

SSH报错

ssh: connect to host github.com port 22: Connection timed out

测试:

ssh -T git@github.com

测试端口:

ssh -T -p 443 git@ssh.github.com

端口22为ssh默认端口,初步怀疑和github服务器有关,于是将其端口修改为443:

修改方法

切换到 cd ~/.ssh/

进入到~目录下面的.ssh下面,修改ssh配置,新建config文件

将上述文件添加配置:

1
2
3
4
5
6
7
8
9
10
11
Host github.com /*服务器地址为github地址*/

User "XXX@XX.com" /*github上的注册邮箱为用户账号*/

Hostname ssh.github.com /*服务器地址为github地址*/

PreferredAuthentications publickey /*采用公匙*/

IdentityFile ~/.ssh/id_rsa /*公匙文件路径*/

Port 443 /*修改端口为443*/

push报错

failed to push some refs to git

1
2
3
4
5
6
7
8
9
\$ git push -u origin master \\
To git@github.com:ShawnDong98/Algorithm-Book.git \\
 ! [rejected]        master -> master (fetch first) \\
error: failed to push some refs to 'git@github.com:ShawnDong98/Algorithm-Book.git' \\
hint: Updates were rejected because the remote contains work that you do \\
hint: not have locally. This is usually caused by another repository pushing \\
hint: to the same ref. You may want to first integrate the remote changes \\
hint: (e.g., 'git pull ...') before pushing again. \\
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

出现错误的主要原因是github中的README.md文件不在本地代码目录中

可以通过如下命令进行代码合并【注:pull=fetch+merge]

git pull –rebase origin master

执行上面代码后可以看到本地代码库中多了README.md文件

此时再执行语句 git push -u origin master即可完成代码上传到github

域名解析被污染

  1. 到https://ipaddress.com/website/ssh.github.com 网站查询IP,下面的 IP Address 就是

  1. 知道ip后,找到.ssh 文件夹下建立 config 文件,如果没有可以创建一个,内容如下:
1
2
3
4
5
6
Host github.com
User 你的github邮箱地址
Hostname 查到的IP地址
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa
Port 443

Reference

  1. 廖雪峰的Git教程
  2. 记Git报错-refusing to merge unrelated histories
  3. github默认端口22被占用,ssh: connect to host github.com port 22: Connection timed out
  4. 如何解决failed to push some refs to git
  5. git删除已经add的文件
  6. 删除GitHub项目的文件或者文件夹
  7. git 删除历史commit
  8. .gitignore
  9. Git 的常规分支使用【dev和master】
  10. 修改git用户名/邮箱/密码并记住密码
  11. 远程分支和本地分支的解释
  12. Git LFS的使用