NotePublic/Software/Applications/Git/Git_使用说明.md

342 lines
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Git 使用说明
## 初始配置
### Git 初始配置
在使用 Git 前需要配置好用户名和电子邮件信息Git 需要使用这些配置信息用于提交代码。在 Git 命令行下,可以使用如下命令设置用户名和电子邮件信息:
```sh
git config --global user.name "Your name"
git config --global user.email "Your email"
```
查看当前配置的用户名和电子邮件信息命令如下:
```sh
git config --global user.name
git config --global user.email
```
git 访问某些 https 连接会出现 SSL 认证错误,此时可通过全局配置关闭 SSL 认证:
```sh
git config --global http.sslVerify "false"
```
克隆比较大的项目时容易出现 RPC failed通过将 postBuffer 设置大些以解决此问题:
```sh
git config --global http.postBuffer 524288000
```
### Git 与 SSH
如果想访问远程 Git 服务器,则最好通过 SSH 方式。这需要先生成 RSA 密钥,然后将公钥部署到远程服务器上即可。生成 RSA 密钥可使用 OpenSSH命令如下Windows 下该命令位于 /\<git 安装目录\>/usr/bin/ 下,可使用 Git Bash 直接访问):
```sh
ssh-keygen
```
之后一路回车,生成文件为:
```sh
<Usr>/.ssh/id_rsa
<Usr>/.ssh/id_rsa.pub
```
其中 id_rsa 为私钥id_rsa.pub 为公钥,将公钥中的内容拷贝到远程服务器中对应的设置项中即可。
TortoiseGit 需要额外修改 Settings->Network->SSH 为 C:\Windows\System32\OpenSSH\ssh.exe 才可以通过 OpenSSH 密钥来访问服务器。否则默认使用 PuTTY 格式密钥。
## 创建仓库
软件版本管理依赖于软件仓库的概念,一个软件仓库包容了要进行版本管理的源码和 Release 发布等内容。
在要进行版本管理的目录下键入
```sh
git init
```
命令,可完成软件版本仓库的创建操作,在创建完软件仓库后,该目录下会生成一个名为“.git”的隐藏文件夹该文件夹下保存了软件的历史和分支等版本信息通常不需要直接操作该目录。
## 添加跟踪文件
版本仓库所在文件夹下的文件并不是全部都会被 git 跟踪和管理。如果需要将该文件夹下将某个文件纳入到版本管理中,则需要通过 add 命令添加到 git 仓库中进行跟踪:
```sh
git add <file name>
```
例如:
```sh
git add main.c
```
## 取消跟踪文件
如果对某个文件取消跟踪,但还需要保留本地文件,则使用如下命令:
```sh
git rm --cached <file name>
```
如果取消对某个文件的版本管理,并且要删除该文件,则使用如下命令:
```sh
git rm --f <file name>
```
## Clone 仓库
更多的时候,不需要手动创建 git 仓库。git 仓库很可能已经存在于远端服务器或别人的计算机中,这时候我们只需要将其 clone 到本地即可:
```sh
git clone <URL>
```
例如:
```sh
git clone https://192.168.1.8/path/repo.git
```
git 支持 http、https、ssh 格式的 URL 访问。
## 提交变更
在修改代码或相关文件后,需要先将变更缓存到本地,这一步被称作 commit。带签名的提交命令如下
```sh
git add .
git commit -s -m "Message"
```
如果想对上次提交进行修改,或将本次提交与上次提交合并,可为 commit 增加 amend 参数,如下:
```sh
git commit --amend
```
之后可通过交互界面进行编辑和修改。
## 时光穿梭
如果文件尚未 stash可使用 checkout 命令撤回修改:
```sh
git checkout -- <file>
```
如果文件已 stash 但是没有 commit可使用 reset 命令撤回修改:
```sh
git reset HEAD <file>
```
如果文件已经 commit可使用下列命令
```sh
git reset --soft <commit id>
git reset --hard <commit id>
git reset --hard HEAD~10
git revert <commit id>
```
注意 soft 与 hard 的区别主要在于 hard 不保留工作区中的内容,但是 soft 保留工作区中的内容。而 reset 与 revert 的区别在于 revert 是放弃指定提交的修改但是会生成一次新的提交需要填写提交注释以前的历史记录都在而reset是指将HEAD指针指到指定提交历史记录中不会出现放弃的提交记录。
## 分支管理
通过以下命令创建新的本地分支:
```sh
git branch <branch>
```
还可以通过以下命令查看分支情况:
```sh
git branch
git branch -a
```
使用下列命令切换到对应分支:
```sh
git checkout <branch>
```
删除某本地分支的命令为:
```sh
git branch -d <branch>
```
删除某远程分支的命令为
```sh
git push <repository> --delete <branch>
```
将某个分支与当前分支合并的命令为:
```sh
git merge <branch>
```
以下命令为本地分支指定一个与之对应的远程分支:
```sh
git branch --set-upstream-to=origin/<remote branch> <local branch>
```
## 查看历史
版本管理提供的最主要的功能之一便是历史追溯,可以查看每一次变更的内容,相关提交的信息等。通过下列命令实现:
```sh
git show
```
## Tag 节点
可以通过:
```sh
git tag
```
命令列出当前仓库中的所有标签,创建一个带附注的的标签则可以使用以下命令实现:
```sh
git tag -a <tag name> -m "Message"
```
还可以使用:
```sh
git tag <tag name>
```
创建一个轻量标签。
## 推送本地分支到远程分支
```sh
git push <repository> <local refspec>:<remote refspec>
```
如,推送本地的 new 分支与 origin 主机的 master 分支合并:
```sh
git push origin new:master
```
## 从远程分支更新本地分支
```sh
git pull <repository> <remote refspec>:<local refspec>
```
如,要取回 origin 主机的 new 分支,与本地的 master 分支合并:
```sh
git pull origin new:master
```
如果远程仓库有所变更,但本地代码没有更新就进行了 commit在使用 git pull 的时候会进行自动 merge如果有冲突则需要手动解决。
## 删除远程分支/Tag
删除远程分支命令为:
```sh
git push origin --delete <branchName>
```
删除远程 Tag 的命令为:
```sh
git push origin --delete tag <tagname>
```
如果远程分支/Tab 已经删除,需要同步到本地,可使用以下命令:
```sh
git remote prune <repository>
```
## 推送/获取 Tag
推送本地 Tag 到远程的命令为:
```sh
git push --tags
```
从远程获取 Tag 到本地的命令为:
```sh
git fetch origin tag <tagname>
```
## Rebase
由于合并分支,或从远程仓库中更新代码产生了额外的 merge 节点,此时可通过 rebase 命令消除这些额外的 merge 节点,使 git 历史的线性更好:
```sh
git rebase [-i] [upstream]
```
通过增加 -i 参数可进入交互模式。使用 Rebase 还可以将多次提交进行合并,或设置起止点。
```sh
git rebase [-i] [start point] [end point]
```
如果发生了冲突,可以在解决冲突并 add 后,通过:
```sh
git rebase --continue
```
命令继续 rebase。
## 同步 fork 的仓库
基本原理是增加上游仓库,然后进行 fetch 和 merge最后 push 到当前仓库,如果已经添加了上游仓库,无需再次添加。
```sh
git remote add upstream <upstream repository url>
git fetch upstream
git merge upstream/master
git push <repository>
```
## Patch
### 生成 Patch
先 git log 看一下有哪些提交,然后看一下要从那个 commit id 开始生成 Patch。然后从 commit id 开始(不包含该 commit id生成 Patch
```sh
git format-patch <commit id>
```
### 应用 Patch
将所有 Patch 拷贝到某一文件夹下,然后:
```sh
git am --abort
git am <patch dir>/*.patch
```
## 参考资料
[Pro Git](https://git-scm.com/book/zh/v2)
[Git Reference Manual](https://git-scm.com/docs)