git笔记-3-git常用命令
一、git环境初始化
使用各命令前需要先安装git:
# sudo apt-get install git
# sudo apt-get install git-doc git-svn git-email git-gui gitk
如果是第一次使用 Git,需要进行如下设置:
# git config --global user.name "AlohaJack"
# git config --global user.email "( 你自己的邮箱地址) "
之后 git init 可以创建一个git仓库。
二、常用简单命令
1. git reset
git reset --hard <commit_id> //正真的退回到了<commit_id>状态,git记录个源码都退到那个状态了。
git reset –mixed <hash/HEAD/HEAD^>:此为默认方式,等效git reset,它回退到某个版本,但保留源码,只回退commit和index信息,即只保留工作区的改动。HEAD 最近一次提交,HEAD^ 上一次提交.
git reset –soft:回退到某个版本,只回退了commit的信息,不回退暂存区和工作区。
git reset –hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容,即工作区也会回退。
git reset --hard origin/master //把自己的本地master分支和远程master分支保持一致
--soft: 保留源码,只回退到commit 信息到某个版本.不涉及index的回退,如果还需要提交,直接commit即可.
--mixed: 会保留源码,只是将git commit和index 信息回退到了某个版本. git reset 默认是 --mixed 模式; git reset --mixed等价于git reset
--hard: 源码也会回退到某个版本,commit和index 都回回退到某个版本.(注意,这种方式是改变本地代码仓库源码)
2. git reflog
git reflog //查看分支切换信息,git checkout + commit_id 切到某一个分支。
git reflog 查看所有能查看到的操作的记录.
3. git push
git push origin HEAD:refs/for/<branch> //向上游push代码
4. git checkout
git checkout . //本地所有修改的还没有来得及提交的,都返回到原来的状态。
git checkout --test.txt //只提取这一个文件
5. git stash
git stash #把所有没有提交的修改暂存到stash里面。可用git stash pop恢复。
(1) 压栈当前工作区
$git stash
do some work
$git stash pop
(2) git stash list 打印git栈信息便于区分版本号,可以利用这个列表来决定从那个地方恢复。例如使用’git stash apply stash@{1}’就可以将你指定版本号为stash@{1}的工作取出来,
当你将所有的栈都应用回来的时候,可以使用’git stash clear’####来将栈清空。
(3) git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。
(4) git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。
(5) git stash show <stash num>: 类似 git show --state,显示stash的问题,看不到stash文件的改动。
(6) git stash clear: 清空git栈,删除所有存储的进度。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。
(7) git stash apply [--index] [<stash>] 除了不删除恢复的进度之外,其余和git stash pop 命令一样。
(8) git stash drop [<stash>] 删除一个存储的进度。默认删除最新的进度。
(9) git stash branch <branchname> <stash> 基于进度创建分支。
6. git revert
git revert 撤销提交
git revert HEAD //撤销最近一次提交
git revert HEAD~1 //表示撤销最近2次提交,这个数字是从0开始的
git revert 0ffaacc //撤销0ffaacc这次提交
git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。
7. git diff
git diff //工作区修改
git diff --cached //暂存区修改
git diff topic master 或 git diff topic..master //直接将两个分支上最新的提交做diff
git diff topic...master //输出自topic和master分别开发以来,master分支上的changed。
git diff <bransh> //示当前目录和'branch'分支的差别, 比如 origin/master ####
git diff HEAD -- ./lib //显示当前目录下的lib目录和上次提交之间的差别(更准确的说是在当前分支下)
git diff -- filename //只显示文件filename的差别
git diff HEAD^ HEAD //比较上次提交commit和上上次提交, 应该等同于git show HEAD
git diff SHA1 SHA2 //比较两个历史版本之间的差异
git diff test.txt //只使用git diff 查看某一个文件
8. git cherry-pick
git cherry-pick 6623be8 将其它分支中id为6623be8拿到当前分支上!
9. git fetch
git fetch -p //同步服务器代码
10. git config
git config --global core.whitespace cr-at-eol 让git diff的时候忽略换行符的差异:
11. git clone
git由于历史提交过多过大,快速克隆下来
git clone --depth 1 <仓库URL>
git clone --depth 1 --branch <分支名> <仓库URL>
注: 仓库URL 可以通过 cat .git/config 获取
二、向社区提交补丁
1. 基础操作
git send-email 是 Git 内置的补丁邮件发送工具,通过 SMTP 协议直接发送代码变更,广泛用于 Linux 内核等项目的协作。其核心价值在于将 Git 提交转化为符合邮件列表规范的补丁,支持线程化发送和收件人管理,尤其适合需邮件沟通的开源协作场景.
通过 git send-email,开发者可无缝对接邮件驱动的协作流程,其设计哲学与 Git 的分布式思想一脉相承——不依赖中心化平台,仅通过邮件即可完成代码评审与提交。
(1) 基础配置:
sudo apt-get install git-email
# 此信息会作为补丁的 From 字段和 Signed-off-by 签名。
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com" #发件人邮箱
此信息会作为补丁的 From 字段和 Signed-off-by 签名。
---------------------------------------------------------------------------------------------------- 邮箱类型 SMTP服务器 端口 加密方式 配置命令示例 ---------------------------------------------------------------------------------------------------- Gmail smtp.gmail.com 587 tls git config --global sendemail.smtpserver smtp.gmail.com 网易163 smtp.163.com 465 ssl git config --global sendemail.smtpencryption ssl QQ邮箱 smtp.qq.com 465 ssl git config --global sendemail.smtppass "授权码"(非登录密码) ----------------------------------------------------------------------------------------------------
关键参数:
sendemail.smtpuser: 邮箱地址(如 your.email@gmail.com)
sendemail.smtppass: SMTP 授权码(需在邮箱设置中开启,非登录密码)
sendemail.smtpserverport: 端口号(如 Gmail 用 587,163 用 465)
可通过 git config --list | grep sendemail 检查配置是否生效
(2) 生成补丁
使用 git format-patch 将提交转化为标准补丁文件:
# 生成最近1个提交的补丁(文件名如 0001-xxx.patch)
git format-patch -1 HEAD
# 生成从指定提交到当前分支的所有补丁(例如基于 master 分支)
git format-patch origin/master
补丁文件包含提交信息、代码变更和 Signed-off-by 签名,可直接用于邮件发送。
(3) 发送补丁邮件
git send-email --to "收件人@example.com" --cc "抄送@example.com" *.patch
注:
--to: 主要收件人(如项目维护者邮箱)
--cc: 抄送地址(如邮件列表 linux-kernel@vger.kernel.org)
*.patch: 需发送的补丁文件(支持通配符或具体文件名)
编辑补丁内容:添加 --annotate 在发送前编辑每封邮件内容。
回复现有邮件:通过 --in-reply-to=<Message-ID> 使新补丁成为线程回复
实例:
# 发送单个补丁给维护者和邮件列表
git send-email --to "maintainer@kernel.org" \ --cc "linux-mm@kvack.org" \ --cc "linux-kernel@vger.kernel.org" \ 0001-mm-fix-memory-leak.patch
此命令将补丁发送给内存管理子系统维护者,并抄送到相关邮件列表
2. 常见问题与解决方案
(1) SMTP 认证失败
确认 smtppass 是授权码(如 QQ 邮箱需在「设置-账户」开启 SMTP 并生成授权码)
检查端口和加密方式是否匹配(如 Gmail 用 587 + tls,163 用 465 + ssl)。
(2) 中文乱码
添加编码配置:git config --global sendemail.assume8bitEncoding utf-8
(3) 批量发送限制
部分邮箱(如 163)限制单次发送量,可通过 --batch-size=5 每 5 封邮件重连一次服务器
3. 最佳实践
(1) 补丁规范:提交信息需包含「子系统: 简短描述」(如 mm: fix memory leak in allocator),并通过 ./scripts/checkpatch.pl 检查格式(适用于内核开发)。
(2) 收件人管理:使用 git config --global sendemail.to "default@example.com" 设置默认收件人,避免重复输入。
(3) 测试验证:发送前用 git apply --check 0001-xxx.patch 验证补丁可正常应用。
4. 参考
git send-email 手册:
https://www.verydoc.net/git/00003657.html#:~:text=%E4%BD%95%E6%97%B6%20--,%E5%BA%94%E8%AF%A5%E4%BD%BF%E7%94%A8%E3%80%82
git命令怎么发送邮件:https://worktile.com/kb/ask/253144.html#:~:text=%E2%80%9C%60%20su,u.php
我修了Linux内核的一个小bug,应该如何把它推进主线呢?:https://www.zhihu.com/question/332347632/answer/761027513#:~:text=0001-,%E4%BB%B6%E5%88%97%E8%A1%A8%E4%BA%86%E3%80%82
三、浅克隆转换完整克隆
使用 "git clone --depth=1" 创建的克隆只包含最近一次提交记录,执行 git log 会显示 "grafted" 标记(表示嫁接提交),若想看所有提交记录,需要将浅克隆转换为完整克隆。方法是执行 git fetch --unshallow, 该命令会从远程拉取所有缺失的历史记录并整合到本地仓库。
注: 若命令提示 "fatal: --unshallow on a complete repository",说明仓库已为完整克隆,无需重复操作.
posted on 2017-10-25 19:47 Hello-World3 阅读(178) 评论(0) 收藏 举报
浙公网安备 33010602011771号