Git 笔记
Git 笔记
记录一些 Git 的使用技巧
Clone
git clone url
添加远程库
git remote add remote-name url # 为本地库添加远程库
git remote rename oldname newname # 修改本地的远程库名字,防止重名
添加代码
git add ./* # 添加当前文件夹下的所有文件到本地库缓存
git add -A ./* # 添加,删除本地库缓存中的所有文件
提交代码到本地库
git commit -m "message"
本地库推送到远端库
git push -u origin master # 第一次推送到名为origin远端库的master分支
git push # 之后就可以直接使用此命令推送到 origin master
git push 远程库名 远程分支名
更新本地库
git pull origin master # 从远程origin master分支更新本地库
git pull remote-repo-name branch-name # 从remote-repo-name master 更新本地库
补充提交
一次 commit以后,突然发现还有点问题,又修改了几行代码,不想生成一个新的 commit 怎么办?可以使用如下命令。
git add .
git commit --amend --no-edit
git grep
git grep "example" # 搜索包含字符串 "example" 的所有文件:
git 命令
// 删除 stage 中的文件夹
git rm directoryname -r -f
// 打包成可以发布的压缩包
git archive
// check the changes before the file was added.
git diff
// 只显示一行递交日志
git log --pretty=oneline check commit log
// 显示分支和单行提交日志
git log --graph --decorate --pretty=oneline --abbrev-commit
// 最近使用的命令
git reflog
// 用图形显示最近的提交状况
git log --graph
git fundamental
提交号
de0f7af4a7b8a91aeddec1d1a11b227c0abf3546 append GPL
108236f87f8d615c50cdc68df0a4da381b8edbe5 new char
7745e97f222147e397c373f5b7be29c4fc377286 first file in git
十六进制的字符串随机生成来标记 commit id
Git 必须知道当前版本是哪个版本,在Git中,用 HEAD 表示当前版本,上一个版本就是 HEAD^,上上一个版本就是HEAD^^,当然往上 100 个版本写 100 个 ^ 比较容易数不过来,所以写成 HEAD~100。
回退
git reset // 回到上一个版本
git reset --hard HEAD^ // 同样是回到上一个版本
git checkout -- filename // 在添加之前取消修改
git checkout -- readme.txt
一种是 readme.txt 自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态。
一种是 readme.txt 已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次 git commit 或 git add 时的状态。
git reset HEAD -- filename // 撤销修改
git checkout -- filename // 取消工作区的修改
删除
git rm filename // 确实要删除该文件
git commit -m " " // 提交修改
git checkout -- filename // 撤销修改
GitHub
将本地库与 GitHub 连接起来
创建 SSHKey。在用户主目录下,看看有没有 .ssh 目录,如果有,再看看这个目录下有没有id_rsa 和 id_rsa.pub 这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建 SSH Key:
ssh-keygen -t rsa -C "youremail@example.com"
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个 Key 也不是用于军事目的,所以也无需设置密码。如果一切顺利的话,可以在用户主目录里找到 .ssh 目录,里面有 id_rsa 和 id_rsa.pub 两个文件,这两个就是 SSHKey 的秘钥对,id_rsa 是私钥,不能泄露出去,id_rsa.pub 是公钥,可以放心地告诉任何人。
# 在github上创建一个新的仓库,将本地库与远程库连接起来。
git clone URL
git push -u origin master //orgin 远程的master分支
git push orgin master // 非第一次,可以取消-u参数
# 分支的创建和合并
git checkout -b dev //create and change into the branch
git checkout master //return master match
git merge branchname //merge branchname into current branch
git branch -d dev //delete dev branch
# 分支管理
git stash //保存现场
git stash pop //恢复工作区并弹出断点
git stash apply //恢复工作区不弹出断点
git branch -D name //强行删除分支
git diff
通常 working area 的文件都是被当作目标文件来看待。
- -开头的行,是只出现在源文件中的行。
- +开头的行,是只出现在目标文件中的行。
- 空格开头的行,是源文件和目标文件中都出现的行。
- 差异按照差异小结进行组织,每个差异小结的第一行都是定位语句,由@@开头,@@结尾。
chenshu@chenshuyangzhouhome:~/kaimei/data_service/src$ git diff 0c5ee16a6a4c849d0ae0448caa8ff17
4399c7c3c ./socket_helper.cpp
diff --git a/data_service/src/socket_helper.cpp b/data_service/src/socket_helper.cpp
index d606452..047e213 100755
a/data_service/src/socket_helper.cpp
+++ b/data_service/src/socket_helper.cpp
@@ 4,6 +4,7 @@
#include "data/login_response.h"
#include "data/heartbeat_response.h"
#include "helper/parser.h"
+#include "helper/time_measure.h"
#include <booster/log.h>
#include "exception/socket_error.h"
#include "exception/data_error.h"
上面的diff结果表明
- 某个提交记录 0c5ee 代表的 socket_helper.cpp 文件是源文件,当前 working area的 socket_helper 文件是目标文件。
- 在源文件第 4 行开始的 6 行和目标文件第 4 行开始的 7 行构成一个差异小结。
- 这个差异小结中,目标文件添加了一行 #include "helper/time_measure.h"。
- 其他空格开头的行表明没有差异。
git submodule
Git 的子模块(submodule)功能允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。这在管理大型项目时非常有用,尤其是当你的项目依赖于外部库或框架时。
初始化子模块
git submodule add <repository-url> [path]
其中
克隆包含子模块的仓库
当你克隆一个包含子模块的仓库时,需要使用 --recurse-submodules 选项来同时克隆子模块,如图所示:
git clone --recurse-submodules <repository-url>
更新子模块
当你的主仓库中的子模块需要更新时,可以使用以下命令:
git submodule update --remote
etc
git 修改子模块的路径
git 在两个地方存储有关子模块的信息。第一个是在一个名为的文件中 .gitmodules,该文件被签入 git 存储库。对此文件的更改将传播到其他存储库。另一个位置在.git/config,并且它是执行大多数命令时git实际看起来的位置。所以想象你已经在一个项目上工作了一段时间,并且有一个名为的子模块 foo。这个子模块的文件是从一些 url 中检出的,在哪里并不重要。但是,在某些时候,这个网址会发生变化。也许它会发生变化,以便从不同的服务器或不同的路径或其他任何地方检出子模块。当您更新存储库时,您 .gitmodules 将更新文件的副本,但不会更新您的 .git/config 文件; 你仍然会从旧网址中查看。当您想要从新网址开始签出时,您将运行 git submodule sync 以将新配置从中复制 .gitmodules 到 .git/config 。git 不会自动执行此操作,因为您可能已对配置进行了自己的更改,并且不希望覆盖它们。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧