惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

K
Kaspersky official blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
AI
AI
SecWiki News
SecWiki News
宝玉的分享
宝玉的分享
Scott Helme
Scott Helme
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Engineering at Meta
Engineering at Meta
博客园 - 叶小钗
The GitHub Blog
The GitHub Blog
Microsoft Azure Blog
Microsoft Azure Blog
N
News and Events Feed by Topic
Cloudbric
Cloudbric
B
Blog
Cisco Talos Blog
Cisco Talos Blog
V
Vulnerabilities – Threatpost
N
News and Events Feed by Topic
V
Visual Studio Blog
A
Arctic Wolf
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
U
Unit 42
S
Security @ Cisco Blogs
博客园 - 聂微东
T
Threat Research - Cisco Blogs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
Y
Y Combinator Blog
G
GRAHAM CLULEY
L
LINUX DO - 热门话题
量子位
NISL@THU
NISL@THU
Webroot Blog
Webroot Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
Troy Hunt's Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
T
Tenable Blog
月光博客
月光博客
S
Security Affairs
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
The Hacker News
The Hacker News
Spread Privacy
Spread Privacy
D
Docker
www.infosecurity-magazine.com
www.infosecurity-magazine.com
雷峰网
雷峰网
博客园 - 司徒正美
T
The Exploit Database - CXSecurity.com
Hugging Face - Blog
Hugging Face - Blog
Help Net Security
Help Net Security
D
DataBreaches.Net

HelloDog

字节跳动和TikTok内推 nftables代替iptables的新一代防火墙配置指南 新加坡女佣申请中国签证 新加坡信用卡cashback和miles的使用心得 关于AI的基础知识和第三方AI应用 新加坡政府小学报名和学区房义工的选择分析 新加坡幼儿园和托儿所的报名准备经验分享 新加坡政府学校和国际学校的上学路径分析 新加坡聘请女佣的流程和注意事项 AdGuard过滤规则分享 新加坡宽带套餐选择推荐和路由器配置经验分享 MacBook从mac intel升级到apple silicon 使用GitHub和Hexo搭建免费静态Blog macOS使用iterm2启用rz与sz功能 新加坡保险和理财规划 新加坡生娃和养娃的重要时间线记录 新加坡申请LTVP的流程介绍 MySQL使用mysqldump导出和导入数据常用命令 新加坡生小孩的医院和流程费用介绍
Git常用命令和Git团队使用规范指南
wsgzao · 2024-08-25 · via HelloDog

前言

在2005年的某一天,Linux之父Linus Torvalds 发布了他的又一个里程碑作品——Git。它的出现改变了软件开发流程,大大地提高了开发流畅度,直到现在仍十分流行,完全没有衰退的迹象。其实一般情况下,只需要掌握git的几个常用命令即可,但是在使用的过程中难免会遇到各种复杂的需求,这时候经常需要搜索,非常麻烦,故总结了一下自己平常会用到的git操作。本文根据团队实践记录Git入门指南和Git常用命令,文章中不仅记录了Git的搭建和使用教程,还参考了大量Git团队使用规范上的经验,希望大家可以结合自己团队的实际应用场景让Git协作优雅的落地。

Git是目前世界上最先进的分布式版本控制系统

更新记录

2024年08月25日 - 更新Git视频教程和GitCheatSheet
2020年02月06日 - 更新Git命令学习
2016年04月22日 - 初稿

阅读原文 - https://wsgzao.github.io/post/git/

SVN与Git的最主要的区别

SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。

Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

Git搭建和使用

Git上手并不难,深入学习还是建议多实践,可以参考扩展阅读中廖雪峰的Git教程

Git服务端

服务端搭建Git很简单,有更多需求不妨试试Gogs和Gitlab

使用Gogs轻松搭建可能比GitLab更好用的Git服务平台 - https://wsgzao.github.io/post/gogs/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

sudo apt-get install git
yum install git


sudo adduser git


ssh-keygen -t rsa
vi ~/.ssh/authorized_keys


sudo git init --bare sample.git
sudo chown -R git:git sample.git


vi /etc/passwd
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell


git clone git@server:/srv/sample.git

管理公钥推荐使用Gitosis
Gitosis - https://github.com/res0nat0r/gitosis
Gitosis配置手记 - http://debugo.com/gitosis/

管理权限推荐使用Gitolite
Gitolite - https://github.com/sitaramc/gitolite

Git客户端

Git客户端可以按个人习惯来选择,遵守团队协作中的Git规范标准才是更重要的

Git - https://git-scm.com/
TortoiseGit - https://tortoisegit.org/
SourceTree - https://www.sourcetreeapp.com/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

https://git-scm.com/download/


git config --global user.name "你的姓名"
git config --global user.email "you@example.com"


git clone cap@172.28.70.243:/cap/cap.git

$ git clone cap@172.28.70.243:/cap/cap.git
Cloning into 'cap'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.


touch README
git add README
git commit -m "add readme"
git push origin master

Counting objects: 3, done.
Writing objects: 100% (3/3), 199 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To cap@172.28.70.243:/cap/cap.git
* [new branch] master -> master

Git常用命令

符号约定

  • <xxx> 自定义内容
  • [xxx] 可选内容
  • [<xxx>]自定义可选内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

git config --global user.name "<用户名>"
git config --global user.email "<电子邮件>"


git add [-i]
git status
git commit [-a] -m "<更新说明>"


git clone <git地址>
git fetch
git merge
git pull [<远端别名>] [<远端branch>]
git push [-f] [<远端别名>] [<远端branch>]
git remote add <别名> <git地址>
git remote [-v]
git remote show <远端别名>
git remote rename <远端别名> <新远端别名>
git remote rm <远端别名>
git remote update [<远端别名>]


git branch [-r] [-a]
git branch <分支名>
git branch -b <分支名>
git branch -d <分支名>
git checkout <分支名>
git checkout -b <本地branch> [-t <远端别名>/<远端分支>]
git merge <分支名>

Git常用命令

  • workspace: 本地的工作目录。(记作A)
  • index:缓存区域,临时保存本地改动。(记作B)
  • local repository: 本地仓库,只想最后一次提交HEAD。(记作C)
  • remote repository:远程仓库。(记作D)

以下所有的命令的功能说明,都采用上述的标记的A、B、C、D的方式来阐述。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

git init //创建
git clone /path/to/repository //检出
git config --global user.email "you@example.com" //配置email
git config --global user.name "Name" //配置用户名


git add <file> // 文件添加,A → B
git add . // 所有文件添加,A → B

git commit -m "代码提交信息" //文件提交,B → C
git commit --amend //与上次commit合并, *B → C

git push origin master //推送至master分支, C → D
git pull //更新本地仓库至最新改动, D → A
git fetch //抓取远程仓库更新, D → C

git log //查看提交记录
git status //查看修改状态
git diff//查看详细修改内容
git show//显示某次提交的内容


git reset <file>//某个文件索引会回滚到最后一次提交, C → B
git reset//索引会回滚到最后一次提交, C → B
git reset --hard // 索引会回滚到最后一次提交, C → B → A

git checkout // 从index复制到workspace, B → A
git checkout -- files // 文件从index复制到workspace, B → A
git checkout HEAD -- files // 文件从local repository复制到workspace, C → A


git checkout -b branch_name //创建名叫“branch_name”的分支,并切换过去
git checkout master //切换回主分支
git branch -d branch_name // 删除名叫“branch_name”的分支
git push origin branch_name //推送分支到远端仓库
git merge branch_name // 合并分支branch_name到当前分支(如master)
git rebase //衍合,线性化的自动, D → A


git diff //对比workspace与index
git diff HEAD //对于workspace与最后一次commit
git diff <source_branch> <target_branch> //对比差异
git add <filename> //修改完冲突,需要add以标记合并成功


gitk //开灯图形化git
git config color.ui true //彩色的 git 输出
git config format.pretty oneline //显示历史记录时,每个提交的信息只显示一行
git add -i //交互式添加文件到暂存区

git命令一览

Git 简明指南

GitCheatSheet文件的下载地址:
百度网盘:
https://pan.baidu.com/s/1pL6ofStf6fOccQ5OVlQPbA?pwd=geek 提取码: geek

GoogleDrive:
https://drive.google.com/drive/folders/1Nde7zcX36fWyFJpeBZDV94EQBRVSdghe?usp=share_link

命令 解析
git init 初始化本地 git 仓库(创建新仓库)
git config –global user.name “xxx” 配置用户名
git config –global user.email “xxx@xxx.com“ 配置邮件
git config –global color.ui true git status 等命令自动着色
git config –global –unset http.proxy remove proxy configuration on git
git clone git+ssh://git@192.168.53.168/VT.git clone 远程仓库
git status 查看当前版本状态(是否修改)
git add xyz 添加 xyz 文件至 index
git add . 增加当前子目录下所有更改过的文件至 index
git commit -m ‘xxx’ 提交
git commit –amend -m ‘xxx’ 合并上一次提交(用于反复修改)
git commit -am ‘xxx’ 将 add 和 commit 合为一步
git rm xxx 删除 index 中的文件
git rm -r * 递归删除
git log 显示提交日志
git log -1 显示 1 行日志 -n 为 n 行
git log –stat 显示提交日志及相关变动文件
git show dfb02e6xxxx 显示某个提交的详细内容
git show dfb02 可只用 commitid 的前几位
git show HEAD 显示 HEAD 提交日志
git show HEAD^ 显示 HEAD 的父(上一个版本)的提交日志 为上两个版本 5 为上 5 个版本
git tag 显示已存在的 tag
git tag -a v2.0 -m ‘xxx’ 增加 v2.0 的 tag
git show v2.0 显示 v2.0 的日志及详细内容
git log v2.0 显示 v2.0 的日志
git diff 显示所有未添加至 index 的变更
git diff –cached 显示所有已添加 index 但还未 commit 的变更
git diff HEAD^ 比较与上一个版本的差异
git diff HEAD — ./lib 比较与 HEAD 版本 lib 目录的差异
git diff origin/master..master 比较远程分支 master 上有本地分支 master 上没有的
git diff origin/master..master –stat 只显示差异的文件,不显示具体内容
git remote add origin git+ssh://git@192.168.53.168/VT.git 增加远程定义(用于 push/pull/fetch)
git branch 显示本地分支
git branch –contains 50089 显示包含提交 50089 的分支
git branch -a 显示所有分支
git branch -r 显示所有原创分支
git branch –merged 显示所有已合并到当前分支的分支
git branch –no-merged 显示所有未合并到当前分支的分支
git branch -m master master_copy 本地分支改名
git checkout -b master_copy 从当前分支创建新分支 master_copy 并检出
git checkout -b master master_copy 上面的完整版
git checkout features/performance 检出已存在的 features/performance 分支
git checkout –track hotfixes/BJVEP933 检出远程分支 hotfixes/BJVEP933 并创建本地跟踪分支
git checkout v2.0 检出版本 v2.0
git checkout -b devel origin/develop 从远程分支 develop 创建新本地分支 devel 并检出
git checkout — README 检出 head 版本的 README 文件(可用于修改错误回退)
git merge origin/master 合并远程 master 分支至当前分支
git cherry-pick ff44785404a8e 合并提交 ff44785404a8e 的修改
git push origin master 将当前分支 push 到远程 master 分支
git push origin :hotfixes/BJVEP933 删除远程仓库的 hotfixes/BJVEP933 分支
git push –tags 把所有 tag 推送到远程仓库
git fetch 获取所有远程分支(不更新本地分支,另需 merge)
git fetch –prune 获取所有原创分支并清除服务器上已删掉的分支
git pull origin master 获取远程分支 master 并 merge 到当前分支
git mv README README2 重命名文件 README 为 README2
git reset –hard HEAD 将当前版本重置为 HEAD(通常用于 merge 失败回退)
git branch -d hotfixes/BJVEP933 删除分支 hotfixes/BJVEP933(本分支修改已合并到其他分支)
git branch -D hotfixes/BJVEP933 强制删除分支 hotfixes/BJVEP933
git ls-files 列出 git index 包含的文件
git show-branch 图示当前分支历史
git show-branch –all 图示所有分支历史
git whatchanged 显示提交历史对应的文件修改
git revert dfb02e6e4f2f7b573337763e5c0013802e392818 撤销提交 dfb02e6e4f2f7b573337763e5c0013802e392818
git ls-tree HEAD 内部命令:显示某个 git 对象
git rev-parse v2.0 内部命令:显示某个 ref 对于的 SHA1 HASH
git reflog 显示所有提交,包括孤立节点
git show master@{yesterday} 显示 master 分支昨天的状态
git log –pretty=format:’%h %s’ –graph 图示提交日志
git stash 暂存当前修改,将所有至为 HEAD 状态
git stash list 查看所有暂存
git stash show -p stash@{0} 参考第一次暂存
git stash apply stash@{0} 应用第一次暂存
git grep “delete from” 文件中搜索文本 “delete from”

.gitignore

Some common .gitignore configurations

https://gist.github.com/octocat/9257657

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# Compiled source #
###################
*.com
*.class
*.dll
*.exe
*.o
*.so

# Packages #
############
# it's better to unpack these files and commit the raw source
# git has its own built in compression methods
*.7z
*.dmg
*.gz
*.iso
*.jar
*.rar
*.tar
*.zip

# Logs and databases #
######################
*.log
*.sql
*.sqlite

# OS generated files #
######################
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

如何提交PR

引用kubeasz的帮助文件为例

为项目kubeasz提交pull request

首先请核对下本地git config配置的用户名和邮箱与你github上的注册用户和邮箱一致,否则即使pull request被接受,贡献者列表中也看不到自己的名字,设置命令:

1
2
$ git config --global user.email "you@example.com"
$ git config --global user.name "Your Name"
  1. 登陆github,在本项目页面点击fork到自己仓库
  2. clone 自己的仓库到本地:git clone https://github.com/xxx/kubeasz.git
  3. 在 master 分支添加原始仓库为上游分支:git remote add upstream https://github.com/easzlab/kubeasz.git
  4. 在本地新建开发分支:git checkout -b dev
  5. 在开发分支修改代码并提交:git add ., git commit -am ‘xx变更说明’
  6. 切换至 master 分支,同步原始仓库:git checkout master, git pull upstream master
  7. 切换至 dev 分支,合并本地 master 分支(已经和原始仓库同步),可能需要解冲突:git checkout dev, git merge master
  8. 提交本地 dev 分支到自己的远程 dev 仓库:git push origin dev
  9. 在github自己仓库页面,点击Compare & pull request给原始仓库发 pull request 请求
    a. 等待原作者回复(接受/拒绝)

Git使用规范

Git 使用规范流程 - http://www.ruanyifeng.com/blog/2015/08/git-use-process.html
团队中的 Git 实践 - https://ourai.ws/posts/working-with-git-in-team/
构家网 git 团队协作使用规范 v2 - http://wenku.baidu.com/view/e1430d1b7f1922791788e81e

Git使用规范提醒

  • 使用Git过程中,必须通过创建分支进行开发,坚决禁止在主干分支上直接开发。review的同事有责任检查其他同事是否遵循分支规范。
  • 在Git中,默认是不会提交空目录的,如果想提交某个空目录到版本库中,需要在该目录下新建一个 .gitignore 的空白文件,就可以提交了
  • 把外部文件纳入到自己的 Git 分支来的时候一定要记得是先比对,确认所有修改都是自己修改的,然后再纳入。不然,容易出现代码回溯
  • 多人协作时,不要各自在自己的 Git 分支开发,然后发文件合并。正确的方法应该是开一个远程分支,然后一起在远程分支里协作。不然,容易出现代码回溯(即别人的代码被覆盖的情况)
  • 每个人提交代码是一定要 git diff 看提交的东西是不是都是自己修改的。如果有不是自己修改的内容,很可能就是代码回溯
  • review 代码的时候如果看到有被删除掉的代码,一定要确实是否是写代码的同事自己删除的。如果不是,很可能就是代码回溯

Git练习

如果线下环境做git练习不便,可以选择开源中国的在线Git命令学习

git exercises: navigate a repository

git练习答案

开源中国在线 Git 命令学习

参考文章

珍藏多年的 Git 问题和操作清单

Git 大全

git - 简明指南

猴子都能懂的GIT入门

想要学好Git,应该掌握哪些基础知识?

Git教程

【GeekHour】一小时Git教程