git101 git:(main) ✗ git commit -m "whatever"
[main cc0ff5d] whatever
Committer: nonocast <nonocast@HUIs-Mac-mini.lan>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:
git config --global user.name "Your Name"
git config --global user.email you@example.com
After doing this, you may fix the identity used for this commit with:
git commit --amend --reset-author
1 file changed, 1 insertion(+)
version: git 2.37.0
三剑客
git
git 怎么配置?
通过
git config
命令实现,配置分为local, global, system 3个级别, 通过--list查看对应的配置:/opt/homebrew/etc
git config --list
或git config -l
查看当前配置为什么要配置user.name和user.email?
一般安装后都需要配置global user, 如下:
主要是因为git commit时需要填写name/email标识提交人,如果没有配置,git会根据当前系统的username和hostname自动生成,这显然不是我们希望的:
git 本地仓库怎么提交?
git本地仓库分为3个区域:
.git
)一般情况下,通过
git add
将工作区内容加入到暂存区,然后通过git commit
将暂存区提交仓库区。如何放弃暂存区的所有修改?
比如git add修改文件,或者做了mv操作等等,只要我没有commit,那么就可以直接通过
git reset --hard
撤回到原先状态。怎么查看git log?
可以通过
git help log
和git help --web log
查看进一步的帮助。怎么创建切换branch?
git branch branch-name
git checkout branch-name
git checkout -b new-branch-name
git branch
什么tig?
tig - text-mode interface for Git
如何修改过往commit的meessage?
16 | 怎么修改老旧commit的message?
git rebase -i commitid
, 这里填写目标commit的parent commitid怎样把连续的多个commit整理为1个commit?
17 | 怎样把连续的多个commit整理成1个?
git rebase -i c1
怎样把间隔的多个commit整理为1个commit?
18 | 怎样把间隔的几个commit整理成1个?
git rebase -i c2
怎么比较暂存区和HEAD的差异?
git diff --cached
怎么比较工作区和暂存区的差异?
git diff
git diff -- readme.md index.html
如何让暂存区恢复成和HEAD的一样?
git reset HEAD
git reset --hard HEAD
如何让工作区的文件恢复为和暂存区一样?
git checkout -- readme
reset and checkout
git reset
git checkout
取消最近的几次提交?
比如有c1,c2,c3, 现在HEAD指向c3,然后通过
git reset --hard c1
,此时工作区恢复为c1, 暂存区清空, HEAD指向c1。git支持哪些同步协议?
Git - The Protocols
git clone /srv/git/project.git
或git clone --bare /srv/git/project/.git
git clone ssh://[user@]server/project.git
git clone git://server/project.git
注:
git是如何考虑多个仓库的同步的?
一个git仓库可以通过
git remote
管理和外部仓库的连接, 如下:此时目录下有hello, foo, bar三个仓库,各自有一个md,然后通过git remote 建立连接:
通过
git fetch
就可以将远端的内容复制到本地仓库:底层的逻辑依然是非常清晰的,就是每个仓库管好自己的branch, commit,然后如果添加remote,则将远端的仓库全部拉到本地形成副本,副本以remote name作为prefix,即foo/main, bar/main,互不干扰。
在这个逻辑之上,我们来考虑如何关联hello/main和foo/main两个分支的关联。
git fetch foo
, Download objects and refs from another repository, 即包括tree, commit, branch, tag, blob等等git fetch foo main
, 只取和main有关的objects和refs,对应的分支命名为:foo/main
命令格式:
git fetch <远程主机名> <分支名>
, 以git fetch origin main
为例,即获取origin远端仓库的main分支下所有相关内容基于
git branch <new_branch> [from_branch]
, 可以git branch foo foo/main
, 或者git checkout -b foo foo/main
当然你可以直接将fetch回来的foo/main和本地仓库的main合并(merge),即直接得到了别人的代码,
git merge foo/main
, 实践中需要git merge foo/main --allow-unrelated-histories
git pull <远程主机名> <远程分支名>:<本地分支名>
, 本质上就是pull然后merge此时就应该在本地仓库main分支下
git pull foo main
借助
git branch --set-upstream main origin/main
建立追踪关系后,就可以省略为git pull foo
又因为当前分支只有一个upstream时可以省略remote,所以就简化成最终的
git pull
,其实本意是git pull foo main
,再展开就是git fetch, 然后git merge参考教程