@hainingwyx
2018-09-16T20:57:43.000000Z
字数 8659
阅读 1745
Git
GitHub是为开发者提供Git仓库的托管服务。这是一个让开发者与朋友、同事、同学以及陌生人共享代码的完美场所。
社会化编程
GitHub曾经的logo里面就有Social Coding这个概念,任何人都可以比从前更加容易地获得源代码,将其自由更改并加以公开。
在Github各个页面按下shift + /都可以打开键盘快捷键一览表。
Explore:最尖端的技术和软件
Gist:使用JavaScript编写的Ace编辑器,管理和发布一些没必要保存在仓库中的代码,如比较小的代码片段。
集中型:以Subversion为代表,将所有数据存放在服务器中,有便于管理的优点,但是,一旦开发者所处的环境不能连接服务器,就无法获得最新的源代码。
分散型:以Git为代表,可以拥有多个仓库,开发者不必连接远程仓库就可以开发。
设置姓名和邮箱
$ git config --global user.name "Firstname Lastname"
$ git config --global user.email "youremail@example.com"
这个命令会在“.../User/.gitconfig”中输出设置文件,想要更改信息时,可以直接更改设置文件。
其他初始化操作
$ git config -global core.editor <editor> #设置默认文本编辑器
$ git config -global merge.tool <tool> #设置解决合并冲突时差异分析工具
$ git config --list #检查已有的配置信息
创建新版本库
$ git clone <url> #克隆远程版本库
$ git init #初始化本地版本库
提高命令输出的可读性
$ git config --global color.ui auto
https 和 SSH 的区别
在 github 上添加 SSH key 的步骤
$ cd ~/.ssh
$ ls
这两个命令就是检查是否已经存在 id_rsa.pub 或 id_dsa.pub 文件,如果文件已经存在,那么你可以跳过步骤2,直接进入步骤3。
$ ssh-keygen -t rsa -C "your_email@example.com"
Generating public/private rsa key pair.
# Enter file in which to save the key (/c/Users/you/.ssh/id_rsa): [Press enter]
Enter passphrase (empty for no passphrase):
# Enter same passphrase again:
如果结果为
Your identification has been saved in /c/Users/you/.ssh/id_rsa.
# Your public key has been saved in /c/Users/you/.ssh/id_rsa.pub.
# The key fingerprint is:
# 01:0f:f4:3b:ca:85:d6:17:a1:7d:f0:68:9d:f0:a2:db your_email@example.com
SSH key 已经创建成功,你只需要添加到github的SSH key上就可以。
SSH key 到 github上面去
测试SSH Key
在Git Bash中输入
$ ssh -T git@github.com
或者
$ ssh -T -p 443 git@ssh.github.com
有一段警告
The authenticity of host 'github.com (207.97.227.239)' can't be established.
# RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
# Are you sure you want to continue connecting (yes/no)?
输入 yes 回车,如果创建 SSH key 的时候设置了密码,接下来就会提示你输入密码,如:
Enter passphrase for key '/c/Users/Administrator/.ssh/id_rsa':
当然如果你密码输错了,会再要求你输入,直到对了为止。
注意:输入密码时如果输错一个字就会不正确,使用删除键是无法更正的。
密码正确后你会看到下面这段话,如:
Hi username! You've successfully authenticated, but GitHub does not
# provide shell access.
查看分支间的差别
用 git init 在目录中创建新的 Git 仓库。 你可以在任何时候、任何目录中这么做,完全是本地化的。
在目录中执行 git init,就可以创建一个 Git 仓库了。比如我们创建 runoob 项目:
$ mkdir runoob
$ cd runoob
$ git init
Initialized empty Git repository in /Users/tianqixin/www/runoob/.git/
# 在 /runoob/.git/ 目录初始化空 Git 仓库完毕。
在Git中我们称这个目录的内容为“附属于该仓库的工作树”,文件的编辑等操作在工作树中进行,然后记录到仓库中,以此管理文件的历史快照。如果需要恢复之前的状态,可以从仓库调取之前的快照。
git status 查看仓库状态
git status -s以获得简短的结果输出。
git add 向暂存区添加文件
git add . 命令来添加当前项目的所有文件
git commit 保存仓库的历史记录
$ git commit -m "First commit"
# -m 参数后面的"First commit称作提交信息
$ git commiy -am "Add something"
# 包含了git add 和 git commit
如果想要记录更加详细的信息,直接执行“git commit”命令即可,编辑器记录提交信息的格式为:
退出和保存操作参照Vim编辑器基本操作
git commit -a
跳过git add 提交缓存的流程
$ git log --pretty=short
# 只让程序显示第一行简述信息
$ git log README.md
# 只显示指定文件的信息
$ git log -p
# 查看提交带来的改动
$ git log -p README.md
$ git diff HEAD
# 查看工作树与最新提交的区别,可以在git commit之前用
尚未缓存的改动:git diff
查看已缓存的改动: git diff --cached
查看已缓存的与未缓存的所有改动:git diff HEAD
显示摘要而非整个 diff:git diff --stat
需要在GitHub上建立与本地仓库一致的远程仓库,创建时不要生成README.md文件。
git remote add 添加远程仓库
$ git remote add origin git@github.com:WangYixin-Tom/Modern-Signal-Processing.git
这项指令可以直接从GitHub上拷贝。
git push 推送至远程仓库
$ git push -u origin master
本地仓库的master分支将会被推送到远程仓库中。
远程仓库也可以创建其他分支。例如分支feature-D,将它以同名形式push至远程仓库。
$ git checkout -b feature-D #本地仓库建立分支
$ git push -u origin feature-D #推送至远程仓库
如果提示: error setting certificate verify locations,需要重新定位整证书的位置,并再次推送。
git config --system http.sslcainfo "D:\Program Files\Git\mingw64\ssl\certs\ca-bundle.crt"
$ git clone git@github.com:github-book/git-tutorrial.git #注意不要与之前的仓库在同一个目录下
$ git branch -a #查看分支信息
$ git checkout -b feature-D origin/feature-D #将远程仓库中分支获取至本地仓库
$ git diff #修改之后,查看修改
$ git commit -am "Add feature-D"
$ git push
如果需要获得最新的远程仓库分支
$ git pull origin feature-D
如果两人同时修改了同一部分的源代码,push时就很容易发生冲突。所以多名开发者在同一个分支作业时,建议频繁进行push和pull操作。
不同的分支中,可以同时进行完全不同的作业,等该分支的作业完成之后再与master分支合并,可以实现多人高效地并行开发。
git branch :显示所有分支
git checkout -b feature-A :创建名为feature-A的分支
git branch feature-A
git checkout feature-A:和上面指令相同效果
git checkout -:切换至上一分支
git merge --no-ff feature-A:合并分支
git log--graph:以图表查看分支
merge分支的时候,可能会有冲突,这个时候需要手动查看冲突部分,在编辑器中修改成我们希望得到的样子。然后重新执行add和commit 命令。
在合并特性分支之前,如果发现已经提交的内容中有拼写错误等,可以提交一个修改,将修改压缩到一个历史记录中。
定义:自己修改源代码之后,请求对方仓库采纳该修改时采取的一种行为。在网络上也常常被简称为PR。
Pull Request一般流程
clone
$ git clone git@github.com:hirocastest/first-pr.git
$ cd first-pr
branch
$ git branch -a #查看clone出的仓库分支
$ git checkout -b work gh-pages #创建work分支并自动切换
$ git branch -a #确认切换work分支
$ ls #查看文件列表,并对相应文件做修改
提交修改
$ git diff #查看修改是否正确进行
$ git add index.html
$ git commit -m "Add my impression"
$ git push origin work #创建远程分支
$ git branch -a #查看远程分支
为了防止开发到一半的Pull Request被误合并,可以在标题前面加上[WIP]表示Work In Process。完成之后再去掉这个标记。
如果用户对该仓库拥有编辑权限,则可以直接创建分支,从分支发送Pull Request。可以免去Fork的麻烦。
可以将原仓库设置为远程仓库,从该仓库fetch数据并与本地仓库进行合并,让本地仓库保持最新的状态。
$ git clone git@github.com:hirocastest/Spoon-Knife.git
$ cd Spoon-Knife
$ git remote add upstream git://github.com/octocat/Spoon-knife.git #upstream作为原仓库的表示符
$ git fetch upstream #获取最新源代码
$ git merge upstream/master #合并
以后只要重复这一步骤即可。
首先可以通过代码审查,进行评论和比较。
其次,可以在本地开发环境中反映Pull Request的内容变化
$ git clone git@github.com:ituring/first-pr.git
$ cd first-pr
$ git remote add PR发送者 git@github.com:PR发送者/first-pr.git
$ git fetch PR发送者
$ git checkout -b pr1
$ git merge PR发送者/work
实际开发之中需要检查软件是否能正常运行
$ git branch -D pr1
删除没有用的pr1分支
GitHub上点击Merge Pull Request自动合并至仓库或者利用CLI进行合并操作再push至GitHub
$ git checkout gh-pages # 切换至 gh-pages 分支
$ git merge PR发送者/work #合并分支
$ git diff origin/gh-pages #查看两者区别,确认
# git push
用这种方法处理之后仓库的PR自动从open状态切换到close状态。
查看GitHub的分支列表页面(https://github.com/用户名/仓库名/branches)还可以轻松掌握各分支与master分支的差别。
按下Esc
; 进入命令模式,然后输入
:q
离开 (short for :quit
):q!
离开,不保存(short for :quit!
):wq
保存并离开:wq!
保存并离开,即使只有读取的权限。:x
保存并离开(shorter than :wq
):qa
离开全部 (short for :quitall
)或者可以按下(Esc
Shift
+Z
Shift
+Z
)以写入/保存,同时离开。
Vim有帮助,只需要按下,输入,
Vim has extensive help, so type Esc:helpReturn and you will have all your answers and even a neat tutorial.
master : 默认开发分支; origin : 默认远程版本库
初始化操作
$ git config -global user.name <name> #设置提交者名字
$ git config -global user.email <email> #设置提交者邮箱
$ git config -global core.editor <editor> #设置默认文本编辑器
$ git config -global merge.tool <tool> #设置解决合并冲突时差异分析工具
$ git config -list #检查已有的配置信息
创建新版本库
$ git clone <url> #克隆远程版本库
$ git init #初始化本地版本库
修改和提交
$ git add . #添加所有改动过的文件
$ git add <file> #添加指定的文件
$ git mv <old> <new> #文件重命名
$ git rm <file> #从缓存区和硬盘中删除文件
$ git rm -cached <file> #缓存区删除但硬盘不删除
$ git commit -m <file> #提交指定文件
$ git commit -m “commit message” #提交所有更新过的文件
$ git commit -amend #修改最后一次提交
$ git commit -C HEAD -a -amend #增补提交(不会产生新的提交历史纪录)
查看提交历史
$ git log #查看提交历史
$ git log -p <file> #查看指定文件的提交历史
$ git blame <file> #以列表方式查看指定文件的提交历史
$ gitk #查看当前分支历史纪录
$ gitk <branch> #查看某分支历史纪录
$ gitk --all #查看所有分支历史纪录
$ git branch -v #每个分支最后的提交
$ git status #查看当前状态
$ git diff #查看变更内容
撤消操作
$ git reset -hard HEAD #撤消工作目录中所有未提交文件的修改内容
$ git checkout HEAD <file1> <file2> #撤消指定的未提交文件的修改内容
$ git checkout HEAD. #撤消所有文件
$ git revert <commit> #撤消指定的提交
分支与标签
$ git branch #显示所有本地分支
$ git checkout <branch/tagname> #切换到指定分支或标签
$ git branch <new-branch> #创建新分支
$ git branch -d <branch> #删除本地分支
$ git tag #列出所有本地标签
$ git tag <tagname> #基于最新提交创建标签
$ git tag -d <tagname> #删除标签
合并与衍合
$ git merge <branch> #合并指定分支到当前分支
$ git rebase <branch> #衍合指定分支到当前分支
远程操作
$ git remote -v #查看远程版本库信息
$ git remote show <remote> #查看指定远程版本库信息
$ git remote add <remote> <url> #添加远程版本库
$ git fetch <remote> #从远程库获取代码
$ git pull <remote> <branch> #下载代码及快速合并
$ git push <remote> <branch> #上传代码及快速合并
$ git push <remote> : <branch>/<tagname> #删除远程分支或标签
$ git push -tags #上传所有标签
更新本地仓库
//方法一
$ git fetch origin master //从远程的origin仓库的master分支下载代码到本地的origin master
$ git log -p master.. origin/master//比较本地的仓库和远程参考的区别
$ git merge origin/master//把远程下载下来的代码合并到本地仓库,远程的和本地的合并
//方法二
$ git fetch origin master:temp//从远程的origin仓库的master分支下载到本地并新建一个分支temp
$ git diff temp//比较master分支和temp分支的不同
$ git merge temp//合并temp分支到master分支
$ git branch -d temp//删除temp