Github笔记

任务管理和 BUG 报告可以通过 Issue 进行交互,如果想让特定用户来看,只要用“@ 用户名”的格式书写,对方便会接到通知(Notifications)
GitHub 中可使用的描述方法并不止“@ 用户名”一种。输入“@ 组织名”可以让属于该 Organization(组织)的所有成员收到通知注 a。输入“@ 组织名 / 团队”可以让该团队的所有成员收到通知。这就是同时向多人发送通知的方法。输入“# 编号”,会连接到该仓库所对应的 Issue 编号。输入“用户名 / 仓库名 # 编号”则可以连接到指定仓库所对应的 Issue编号。只要按照这类特定格式书写便会自动创建链接。
image

Git

git设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
git config --global user.name "Firstname Lastname"
git config --global user.email "your_email@example.com"

命令会在~/.gitconfig下添加
[user]
name = yuhengTech
email = 1322304532@qq.com

git config --global color.ui auto

命令会在~/.gitconfig下添加
[color]
ui = auto

git config --global credential.helper store #保存用户名密码
git config --global --list #列出配置


SSH Key设置

密钥生成
ssh-keygen -t rsa -C “your_email@example.com
会产生id_rsa(私钥)和id_rsa.pub(公钥)两个文件。
把id_rsa.pub(公钥)的内容复制到Github SSH KEYS里面

在git使用ssh -T git@github.com测试连通

会显示$ ssh -T git@github.com
Hi yuhengTech! You’ve successfully authenticated, but GitHub does not provide shell access.

怎么更换git远程仓库地址
方法一:

直接在当前项目输入一下命令

git remote set-url origin 新的远程仓库地址
方法二:

git remote origin
git remote add origin 新的远程仓库地址

git常用命令

gitignore

文件 .gitignore 的格式规范如下:
所有空行或者以 # 开头的行都会被 Git 忽略。
可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
匹配模式可以以(/)开头防止递归。
匹配模式可以以(/)结尾指定目录。
要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。

.gitignore对于已经添加到版本库的文件不生效,需要使用git rm –cached file_name 然后再使用ignore生效

git clone

SSH形式
git clone git@github.com:hirocastest/Hello-World.git
HTTPS形式
git clone https://github.com/yuhengTech/gitStudy.git

Https 和 SSH 的区别
就 Git 而言,https 和 ssh 的区别简单的说就是:
https: git clone 和 git pull 无限制,git push 需要提供 credential,一般是你的 github(如果 remote repository 托管在 github 上的话)的用户名和密码;
ssh:因为需要在托管平台上设置 ssh public key,所以要求你必须是该 repository 的拥有者或者管理员。git push 时,无需输入用户名,如果在生成 ssh key 的时候设置了密码,则需要输入密码,否则不需要。
选择过程中的一些建议
如果开发环境在 windows ,产品环境在 linux,建议在 windows 下使用 https,在 linux 下使用 ssh。除了 ssh 本身的限制,这个建议还考虑到其他两个因素:方便、安全。如果 linux 下使用 https,安全性没问题,但为了方便,当然希望在访问 remote repository 时可以免密码。关于这一点,网上大多数的解决方案是将用户名和密码包含在远程地址中,然后使用 git config –global credential.helper store 将 credential 信息以明文方式存储在 .git-credentials 文件中。这样一来,安全性不能保证。所以建议在 linux 下使用 ssh 方式。虽然 ssh key 的部署略微有点麻烦,但是一旦部署好,能同时保证安全性和便捷性。
因为 linux 下使用了 ssh 方式,并且产品环境下的 ssh private key 不能轻易泄露。所以 windows 下建议使用 https 方式。windows 下有 git-credential-winstore 和 git-credential-manager-for-windows 用以存储 credential,所以安全性和便捷性同样可以保证。
如果有多人共同维护产品,ssh 无疑是最好的选择。因为多人维护,所以项目部署至产品环境,无论产品环境是 windows 还是 linux,需要一个统一的密码(即使这个密码为空)。如果使用 https 方式,必须以一个人的账号和密码作为 credential, 这样会有两个问题,一是不利于个人隐私的保护,二是如果此人出现人事变动,会带来不必要的麻烦。
【使用区别】
clone项目:
  使用ssh方式时,需要配置ssh key,即要将生成的SSH密钥对的公钥上传至服务器;
  使用http方式时,没有要求,可以直接克隆下来。
push项目:
  使用ssh方式时,不需要验证用户名和密码,之前配置过ssh key,(如果你没设置密码)直接push即可;
  使用http方式时,需要验证用户名和密码。
总结:
HTTPS利于匿名访问,适合开源项目,可以方便被别人克隆和读取(但没有push权限);
SSH不利于匿名访问,比较适合内部项目,只要配置了SSH公钥极可自由实现clone和push操作。

git status查看状态

状态简览
git status 命令的输出十分详细,但其用语有些繁琐。 Git 有一个选项可以帮你缩短状态命令的输出,这样可以以简洁的方式查看更改。 如果你使用 git status -s 命令或 git status –short 命令,你将得到一种格式更为紧凑的输出。

$ git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
新添加的未跟踪文件前面有 ?? 标记,新添加到暂存区中的文件前面有 A 标记,修改过的文件前面有 M 标记。 输出中有两栏,左栏指明了暂存区的状态,右栏指明了工作区的状态。例如,上面的状态报告显示: README 文件在工作区已修改但尚未暂存,而 lib/simplegit.rb 文件已修改且已暂存。 Rakefile 文件已修改,暂存后又作了修改,因此该文件的修改中既有已暂存的部分,又有未暂存的部分。
git add xxx 把文件加入暂存区/追踪新文件
git commit -m “Add hello world script by php” 提交文件
git commit -a 跳过add,所有已经跟踪过的文件暂存起来一并提交
git push 推送
git log 查看日志

  • 只看第一行日志 git log –pretty=short
  • 查看文件变动 git log -p file.py
  • git log /目录 查看指定位置日志

git commit可以填写详细信息的commit(简要描述,空行,详细描述)

git ls-files 查看暂存区内容

git diff 版本比较

git diff 查看变动,(修改后文件与stage暂存区文件)
git diff HEAD 与当前分支最新一次提交做对比
【在git add前使用git diff,在git commit前使用git diff HEAD】
git diff --staged 或者--cached stage文件与commit文件的对比

关于HEAD和master的理解 https://zhuanlan.zhihu.com/p/40001702
git diff 显示本地开发工作中已经修改但未提交至暂存区的文件和已经提交至暂存区文件的修改
git diff HEAD 显示的是已提交到工作树中文件和未提交到工作树中文件的所有修改。查看已缓存的与未缓存的所有改动。
git diff –cached 上一次最后一次提交到工作树中文件(也就是head)与暂存区内文件的改动。查看已缓存的改动。
总结一下,可以想象有三个环境,一个是我们本地正在编辑的开发环境,一个我们提交的版本库环境,还有中间一个暂时存放代码的暂存区。

git diff 就是我们本地正在开发的但未提交到暂存区文件和之前已经提交到暂存区里的文件的对比;(工作区与暂存区)

git diff head 就是已经提交到版本库环境中的文件和未提交到版本库环境中文件的所有修改对比;(工作区+暂存区与仓库上一次提交)

git diff –cached 最后一次提交到版本库环境中文件和暂存区中文件的对比;(暂存区与仓库上一次提交)

git diff commit_id1 commit_id2或者git diff HEAD^ HEAD 比较两次提交之间的差异,(HEAD^或者HEAD表示上次提交) HEADn :向上n个版本

git diff branch1 branch2 比较分支

rm 删除操作

rm file;git add file //先工作区删除,再暂存区删除

git rm //同时删除工作区和暂存区

git rm –cached //把文件从暂存区删除

git rm -r * //删除

版本回退:

git reset –hard/soft/mixed commit_id/HEAD^
image-1
使用mixed可以合并多次版本提交,避免版本污染
hard 放弃所有修改内容

分支操作

分支操作是多人并行开发的核心

git branch 查看分支

查看所有分支,并显示当前分支

git checkout -b master创建分支

以当前master分支为基础创建新分支,例如 git checkout -b feature-A

相当于
$ git branch feature-A
$ git checkout feature-A

git checkout 切换分支

git checkout name 切换到name分支
git checkout - 切换到上个分支

注意:git checkout -- readme.txt不是分支切换指令,git checkout –命令会将工作区文件恢复到上次commit或者stage暂存区(执行过git add的话)

git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD ,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退

git新版本

Git社区发布了Git的新版本2.23。在该版本中,有一个特性非常引人瞩目,就是新版本的Git引入了两个新命令 git switch 和 git restore,用以替代现在的 git checkout。换言之,git checkout 将逐渐退出历史舞台。

特性分支

特性分支是集中实现单一特性(主题),除此之外不进行任何作业的分支。在日常开发中,往往会创建数个特性分支,同时在此之外再保留一个随时可以发布软件的稳定分支。稳定分支的角色通常由 master 分支担当,创建了 feature-A 分支,这一分支主要实现 feature-A,除feature-A 的实现之外不进行任何作业。即便在开发过程中发现了 BUG,也需要再创建新的分支,在新分支中进行修正。

git switch 命令用于更清晰地切换分支。

git switch 命令作用与 git checkout 类似,但提供了更清晰的语义和错误检查。

切换分支
以下命令允许你从当前分支切换到指定的分支 :

git switch
例如将你的工作目录切换到主分支:

git switch master
创建新分支并切换

如果你想同时创建一个新分支并切换到该分支,可以在 git switch 命令后面加上 -c 或 –create 选项,然后指定分支名称。

以下命令用于创建一个新分支 并立即切换到新创建的分支:

git switch -c
例如创建一个名为 feature-branch 的新分支并切换到它:

git switch -c feature-branch
这将创建一个名为 “feature-branch” 的新分支,并将你的工作目录切换到该分支上。

切换到前一个分支

以下命令可以让你快速切换回前一个分支,无需记住分支名称:

git switch -
切换到标签

如果你有一个标签 ,你可以使用这个命令来切换到该标签所指向的提交状态:

git switch tags/
查看可用分支和标签

以下命令可以让你列出可用的本地分支和标签,以便快速选择要切换的目标:

git branch
与 git checkout 不同,git switch 更容易理解和使用,因为它专注于分支切换的操作,此外,git switch 还提供了更好的错误检查,可以避免一些常见的错误操作。

git merge 合并分支

假设合并feature 分支
git checkout master
git merge –no-ff feature-A

https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E6%9F%A5%E7%9C%8B%E6%8F%90%E4%BA%A4%E5%8E%86%E5%8F%B2