2018-11-27 21:24:49 +08:00
|
|
|
|
# Git 使用说明
|
|
|
|
|
|
|
|
|
|
## 初始配置
|
|
|
|
|
|
|
|
|
|
### Git 与 SSH
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
如果想访问远程 Git 服务器,则最好通过 SSH 方式。这需要先生成 RSA 密钥,然后将公钥部署到远程服务器上即可。生成 RSA 密钥可使用 OpenSSH,命令如下:
|
|
|
|
|
|
|
|
|
|
ssh-keygen
|
|
|
|
|
|
|
|
|
|
之后一路回车,生成文件为:
|
|
|
|
|
|
|
|
|
|
<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 发布等内容。
|
|
|
|
|
|
|
|
|
|
在要进行版本管理的目录下键入
|
|
|
|
|
|
|
|
|
|
git init
|
|
|
|
|
|
|
|
|
|
命令,可完成软件版本仓库的创建操作,在创建完软件仓库后,该目录下会生成一个名为“.git”的隐藏文件夹,该文件夹下保存了软件的历史和分支等版本信息,通常不需要直接操作该目录。
|
|
|
|
|
|
2019-03-26 16:33:51 +08:00
|
|
|
|
## 添加跟踪文件
|
2018-11-27 21:24:49 +08:00
|
|
|
|
|
|
|
|
|
版本仓库所在文件夹下的文件并不是全部都会被 git 跟踪和管理。如果需要将该文件夹下将某个文件纳入到版本管理中,则需要通过 add 命令添加到 git 仓库中进行跟踪:
|
|
|
|
|
|
|
|
|
|
git add <file name>
|
|
|
|
|
|
|
|
|
|
例如:
|
|
|
|
|
|
|
|
|
|
git add main.c
|
|
|
|
|
|
2019-03-26 16:33:51 +08:00
|
|
|
|
## 取消跟踪文件
|
|
|
|
|
|
|
|
|
|
如果对某个文件取消跟踪,但还需要保留本地文件,则使用如下命令:
|
|
|
|
|
|
|
|
|
|
git rm --cached <file name>
|
|
|
|
|
|
|
|
|
|
如果取消对某个文件的版本管理,并且要删除该文件,则使用如下命令:
|
|
|
|
|
|
|
|
|
|
git rm --f <file name>
|
|
|
|
|
|
2018-11-27 21:24:49 +08:00
|
|
|
|
## Clone 仓库
|
|
|
|
|
|
|
|
|
|
更多的时候,不需要手动创建 git 仓库。git 仓库很可能已经存在于远端服务器或别人的计算机中,这时候我们只需要将其 clone 到本地即可:
|
|
|
|
|
|
|
|
|
|
git clone <URL>
|
|
|
|
|
|
|
|
|
|
例如:
|
|
|
|
|
|
|
|
|
|
git clone https://192.168.1.8/path/repo.git
|
|
|
|
|
|
|
|
|
|
git 支持 http、https、ssh 格式的 URL 访问。
|
|
|
|
|
|
|
|
|
|
## 提交变更
|
|
|
|
|
|
|
|
|
|
在修改代码或相关文件后,需要先将变更缓存到本地,这一步被称作 commit。带签名的提交命令如下:
|
|
|
|
|
|
|
|
|
|
git add .
|
|
|
|
|
git commit -s -m "Message"
|
|
|
|
|
|
|
|
|
|
## 时光穿梭
|
|
|
|
|
|
|
|
|
|
如果文件尚未 stash,可使用 checkout 命令撤回修改:
|
|
|
|
|
|
|
|
|
|
git checkout -- <file>
|
|
|
|
|
|
|
|
|
|
如果文件已 stash 但是没有 commit,可使用 reset 命令撤回修改:
|
|
|
|
|
|
|
|
|
|
git reset HEAD <file>
|
|
|
|
|
|
|
|
|
|
如果文件已经 commit,可使用下列命令
|
|
|
|
|
|
|
|
|
|
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指针指到指定提交,历史记录中不会出现放弃的提交记录。
|
|
|
|
|
|
|
|
|
|
## 分支管理
|
|
|
|
|
|
|
|
|
|
通过以下命令创建新的本地分支:
|
|
|
|
|
|
|
|
|
|
git branch <branch name>
|
|
|
|
|
|
|
|
|
|
还可以通过以下命令查看分支情况:
|
|
|
|
|
|
|
|
|
|
git branch
|
|
|
|
|
git branch -a
|
|
|
|
|
|
|
|
|
|
使用下列命令切换到对应分支:
|
|
|
|
|
|
|
|
|
|
git checkout <branch name>
|
|
|
|
|
|
2018-12-18 14:30:21 +08:00
|
|
|
|
删除某本地分支的命令为:
|
2018-11-27 21:24:49 +08:00
|
|
|
|
|
|
|
|
|
git branch -d <branch name>
|
|
|
|
|
|
2018-12-18 14:30:21 +08:00
|
|
|
|
删除某远程分支的命令为
|
|
|
|
|
|
|
|
|
|
git push <repository> --delete <branch name>
|
|
|
|
|
|
2018-11-27 21:24:49 +08:00
|
|
|
|
## 查看历史
|
|
|
|
|
|
|
|
|
|
版本管理提供的最主要的功能之一便是历史追溯,可以查看每一次变更的内容,相关提交的信息等。通过下列命令实现:
|
|
|
|
|
|
|
|
|
|
git show
|
|
|
|
|
|
|
|
|
|
## Tag 节点
|
|
|
|
|
|
|
|
|
|
可以通过:
|
|
|
|
|
|
|
|
|
|
git tag
|
|
|
|
|
|
|
|
|
|
命令列出当前仓库中的所有标签,创建一个带附注的的标签则可以使用以下命令实现:
|
|
|
|
|
|
|
|
|
|
git tag -a <tag name> -m "Message"
|
|
|
|
|
|
|
|
|
|
还可以使用:
|
|
|
|
|
|
|
|
|
|
git tag <tag name>
|
|
|
|
|
|
|
|
|
|
创建一个轻量标签。
|
|
|
|
|
|
|
|
|
|
## 推送本地分支到远程分支
|
|
|
|
|
|
|
|
|
|
git push <repository> <local refspec>:<remote refspec>
|
|
|
|
|
|
|
|
|
|
如,推送本地的 new 分支与 origin 主机的 master 分支合并:
|
|
|
|
|
|
|
|
|
|
git push origin new:master
|
|
|
|
|
|
|
|
|
|
## 从远程分支更新本地分支
|
|
|
|
|
|
|
|
|
|
git pull <repository> <remote refspec>:<local refspec>
|
|
|
|
|
|
|
|
|
|
如,要取回 origin 主机的 new 分支,与本地的 master 分支合并:
|
|
|
|
|
|
|
|
|
|
git pull origin new:master
|
|
|
|
|
|
2018-12-29 09:26:37 +08:00
|
|
|
|
## 删除远程分支/Tag
|
|
|
|
|
|
|
|
|
|
删除远程分支命令为:
|
|
|
|
|
|
|
|
|
|
git push origin --delete <branchName>
|
|
|
|
|
|
|
|
|
|
删除远程 Tag 的命令为:
|
|
|
|
|
|
|
|
|
|
git push origin --delete tag <tagname>
|
|
|
|
|
|
|
|
|
|
## 推送/获取 Tag
|
|
|
|
|
|
|
|
|
|
推送本地 Tag 到远程的命令为:
|
|
|
|
|
|
|
|
|
|
git push --tags
|
|
|
|
|
|
|
|
|
|
从远程获取 Tag 到本地的命令为:
|
|
|
|
|
|
|
|
|
|
git fetch origin tag <tagname>
|
|
|
|
|
|
2018-12-18 14:30:21 +08:00
|
|
|
|
## 同步 fork 的仓库
|
|
|
|
|
|
|
|
|
|
基本原理是增加上游仓库,然后进行 fetch 和 merge,最后 push 到当前仓库,如果已经添加了上游仓库,无需再次添加。
|
|
|
|
|
|
|
|
|
|
git remote add upstream <upstream repository url>
|
|
|
|
|
git fetch upstream
|
|
|
|
|
git merge upstream/master
|
|
|
|
|
git push <repository>
|
|
|
|
|
|
2018-11-27 21:24:49 +08:00
|
|
|
|
## 参考
|
|
|
|
|
|
|
|
|
|
[Pro Git](https://git-scm.com/book/zh/v2)
|
|
|
|
|
|
|
|
|
|
[Git Reference Manual](https://git-scm.com/docs)
|