介绍Git学习笔记的基本资料和访问方式
Git学习笔记
- 1: 介绍
- 2: 安装
- 3: Git命令
- 3.1: branch命令
- 3.1.1: 创建空白分支
- 3.2: commit命令
- 3.3: merge命令
- 3.3.1: 更新fork仓库
- 3.4: tag命令
- 3.4.1: tag命令用法
- 3.5: remote命令
- 3.5.1: 解决can't push错误
- 4:
- 5:
1 - 介绍
1.1 - Git介绍
最好的版本控制软件
TBD
1.2 - 资料收集
官方资料
社区资料
学习资料
教程
- Git教程: 史上最浅显易懂的Git教程!绝对面向初学者,没有接触过版本控制概念的读者也可以轻松入门,不必担心起步难度;
2 - 安装
详细介绍如何在各个操作系统中安装git。
2.1 - Ubuntu安装
以下ubuntu版本都验证OK:
- 16.04
- 20.04
安装
为了拿到最新版本的 git,增加仓库然后再安装:
sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git
安装完成之后,验证版本:
git --version
git version 2.30.0
此时 git 是在 /usr/bin/ 目录下:
root@sky2:~# which git
/usr/bin/git
root@sky2:~# ls -l /usr/bin/git
-rwxr-xr-x 1 root root 1920512 Oct 4 03:50 /usr/bin/git
参考资料
2.2 - MacOS安装
手工安装
下载
在 git官网的下载页面找到mac版本
https://git-scm.com/download/mac
下载得到安装包,如 git-2.19.0-intel-universal-mavericks.dmg
安装
安装过程基本按照默认设置,一路next就好了。
修复
有些在升级macos的版本之后,再使用git时会报错如下:
$ git version
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
此时需要重新安装 xcode command line
:
$ xcode-select --install
参考资料:
brew安装
参考 https://git-scm.com/download/mac 页面的说明。
$ brew install git
……
The Tcl/Tk GUIs (e.g. gitk, git-gui) are now in the `git-gui` formula.
Subversion interoperability (git-svn) is now in the `git-svn` formula.
zsh completions and functions have been installed to:
/opt/homebrew/share/zsh/site-functions
Emacs Lisp files have been installed to:
/opt/homebrew/share/emacs/site-lisp/git
==> **Summary**
🍺 /opt/homebrew/Cellar/git/2.35.1: 1,523 files, 43.5MB
==> **Running `brew cleanup git`...**
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
==> **Caveats**
==> **git**
The Tcl/Tk GUIs (e.g. gitk, git-gui) are now in the `git-gui` formula.
Subversion interoperability (git-svn) is now in the `git-svn` formula.
zsh completions and functions have been installed to:
/opt/homebrew/share/zsh/site-functions
Emacs Lisp files have been installed to:
/opt/homebrew/share/emacs/site-lisp/git
验证安装:
git --version
git version 2.32.0 (Apple Git-132)
2.3 - windows安装
下载
在 git官网的下载页面找到windows版本的下载页面:
https://git-scm.com/download/win
下载最新版本:
https://github.com/git-for-windows/git/releases/download/v2.45.2.windows.1/Git-2.45.2-64-bit.exe
下载得到安装包,如 Git-2.45.2-64-bit.exe。
安装
安装路径选择 C:\Users\sky\work\soft\git
安装过程基本按照默认设置,一路next就好了。
配置
修改启动后的默认路径
安装完成之后,桌面的 Git Bash 快捷方式打开之后,默认进入当前用户的home目录。
如果需要修改,比如我个人习惯直接进入代码存放路径如 C:\work\code
,则需要修改快捷方式的属性。
编辑快捷方式的属性:
目标中删除 --cd-to-home
, 然后将起始位置从默认的 %HOMEDRIVE%%HOMEPATH%
修改为 C:\work\code
。
修改控制台字体
Git Bash 控制台默认的字体如果不合适(通常字体偏小),可以修改。
-
点下图中红色箭头处,下拉菜单中选择"Options"
-
在 “Text” 中可以选择字体和大小
安装配置 zsh
备注:这些工作本应该是 windows 工作环境配置的一部分,但是由于没有合适的地方记录,而我通常会在第一时间把 git 配置好,因此就暂时保存在这里吧。
下载zsh
Zsh下载地址:
https://packages.msys2.org/package/zsh?repo=msys&variant=x86_64
下载 .tar.zst 文件:
https://mirror.msys2.org/msys/x86_64/zsh-5.9-2-x86_64.pkg.tar.zst
这个文件可以用 winrar 解压缩,得到 zsh-5.9-2-x86_64.pkg 目录,里面有两个子目录:etc 和 usr 。
安装zsh
复制 etc 和 usr 目录,粘贴到 git 的安装目录如 C:\Users\sky\work\soft\git
,git 安装目录下同样有 etc 和 usr 目录,文件会自动合并进去。
运行zsh
运行时,要先启动 git 自带的 bash 终端,然后执行 zsh 命令,也可以查看 zsh 版本:
$ zsh --version
zsh 5.9 (x86_64-pc-msys)
为了方便使用,尤其是用 zsh 替代 bash,可以修改 bash 的配置文件 ~/.bashrc (如果没有就创建它) ,加入内容:
/c/Windows/System32/chcp.com 65001 > /dev/null 2>&1
if [ -t 1 ]; then
exec zsh
fi
这样就可以自动 bash 时自动启动 zsh。
第一次执行时会询问文件创建的问题,选择
Quit and do nothing. The function will be run again next time.
安装 Oh my zsh!
在 zsh 终端执行:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
在这里下载并安装几个字体
https://github.com/romkatv/powerlevel10k#meslo-nerd-font-patched-for-powerlevel10k
下载安装 Powerlevel10k 主题:
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
修改
vi ~/.zshrc
增加内容:
ZSH_THEME="powerlevel10k/powerlevel10k"
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(history)
POWERLEVEL9K_SHORTEN_DIR_LENGTH=1
# User configuration
export LS_COLORS="rs=0:no=00:mi=00:mh=00:ln=01;36:or=01;31:di=01;34:ow=04;01;34:st=34:tw=04;34:pi=01;33:so=01;33:do=01;33:bd=01;33:cd=01;33:su=01;35:sg=01;35:ca=01;35:ex=01;32:"
配置以下插件:
git clone https://github.com/zsh-users/zsh-autosuggestions.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
git clone https://github.com/Pilaton/OhMyZsh-full-autoupdate.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/ohmyzsh-full-autoupdate
修改 zsh 配置
vi ~/.zshrc
修改 plugins 为
plugins=(
command-not-found
extract
deno
docker
git
github
gitignore
history-substring-search
node
npm
nvm
yarn
volta
vscode
sudo
web-search
z
zsh-autosuggestions
zsh-syntax-highlighting
ohmyzsh-full-autoupdate
)
# User configuration
ZSH_HIGHLIGHT_HIGHLIGHTERS=(main brackets pattern cursor root line)
ZSH_HIGHLIGHT_PATTERNS=('rm -rf *' 'fg=white,bold,bg=red')
重启 zsh。
Updating plugins and themes Oh My ZSH
--------------------------------------
Updating Plugin — ohmyzsh-full-autoupdate -> https://github.com/Pilaton/OhMyZsh-full-autoupdate
Already up to date.
Updating Plugin — zsh-autosuggestions -> https://github.com/zsh-users/zsh-autosuggestions
Already up to date.
Updating Plugin — zsh-syntax-highlighting -> https://github.com/zsh-users/zsh-syntax-highlighting
Already up to date.
Updating Theme — powerlevel10k -> https://github.com/romkatv/powerlevel10k
Already up to date.
配置网络代理
修改 zsh 配置
vi ~/.zshrc
增加以下内容:
# proxy
alias proxyon='export all_proxy=socks5://192.168.2.1:7891;export http_proxy=http://192.168.2.1:7890;export https_proxy=http://192.168.2.1:7890;export no_proxy=127.0.0.1,localhost,local,.local,.lan,192.168.0.0/16,10.0.0.0/16'
alias proxyoff='unset all_proxy http_proxy https_proxy no_proxy'
2.4 - 初始化配置
查看 git 配置
安装之后,使用下面的命令查看 git 的配置:
$ git config --list
credential.helper=osxkeychain
user.name=Sky Ao
user.email=aoxiaojian@gmail.com
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
core.precomposeunicode=true
remote.origin.url=git@github.com:skyao/learning-git.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
remote.docsy.url=git://github.com/skyao/docsy-example.git
remote.docsy.fetch=+refs/heads/*:refs/remotes/docsy/*
配置全局的name和email
使用下面的命令设置全局的用户 name 和 email :
git config --global --edit
然后修改里面的内容,设置好 name 和 email:
# This is Git's per-user configuration file.
[user]
# Please adapt and uncomment the following lines:
name = Sky Ao
email = aoxiaojian@gmail.com
也可以通过下面两条命令来分别设置:
git config --global user.name "Sky Ao"
git config --global user.email "aoxiaojian@gmail.com"
上面两个方式都是修改全局配置文件,默认地址是 ~/.gitconfig
,可以直接通过 vi 等命令打开修改。
配置单个仓库的name和email
如果有某个仓库需要设置和默认全局用户不一样的 name 和 email,则可以通过如下命令:
git config user.name "aoxiaojian"
git config user.email "aoxiaojian@hotmail.com"
通过可以通过命令 git config --list
进行查看,配置内容同样存放在文件 ~/.gitconfig
中。
参考资料
2.5 - 配置ssh
为了方便日常使用,推荐采用ssh的方式来clone git仓库。
为此,需要创建 ssh key 并配置。
创建 ssh key
ssh-keygen -t rsa
一路回车确认,最后成功生成,创建的 ssh key 文件位于 ~/.ssh/id_rsa.pub
:
$ ls -l ~/.ssh
total 8
-rw------- 1 sky sky 1679 Oct 26 15:24 id_rsa
-rw-r--r-- 1 sky sky 396 Oct 26 15:24 id_rsa.pub
id_rsa.pub 是 ssh 的公钥,后面配置时要提交的公钥的内容就在这个文件中。
github 配置
登录之后,点红色箭头所指处,下拉菜单中点 “settings”, 然后点 “SSH and GPG keys” -> “New SSH key”,最后将 id_rsa.pub 文件的内容复制过来提交:
配置完成之后,尝试以ssh方式执行git clone 命令:
git clone git@github.com:skyao/learning-git.git
2.6 - 配置代理
linux 配置
vi ~/.ssh/config
打开文件(如果不存在则新建文件),内容如下:
# 这里必须是 github.com,因为这个跟我们 clone 代码时的链接有关
Host github.com
# 如果用默认端口,这里是 github.com,如果想用443端口,这里就是 ssh.github.com 详
# 见 https://help.github.com/articles/using-ssh-over-the-https-port/
HostName github.com
User git
# 如果是 HTTP 代理,把下面这行取消注释,并把 proxyport 改成自己的 http 代理的端>口
#ProxyCommand socat - PROXY:192.168.2.1:%h:%p,proxyport=7890
# 如果是 socks5 代理,则把下面这行取消注释,并把 6666 改成自己 socks5 代理的端口
ProxyCommand nc -v -x 192.168.2.1:7891 %h %p
windows 配置
在 windows 下的 gitbash 中,由于没有 nc 命令,因此上面的命令会失败。需要替换为 connect 命令:
Host github.com
HostName github.com
User git
#ProxyCommand socat - PROXY:192.168.2.1:%h:%p,proxyport=7890
ProxyCommand connect -S 192.168.2.1:7891 %h %p
3 - Git命令
3.1 - branch命令
3.1.1 - 创建空白分支
在偶尔的情况下,可能会想要保留那些与你的代码没有共同祖先的分支。例如在这些分支上保留生成的文档或者其他一些东西。
如果需要创建一个不使用当前代码库作为父提交的分支,可以用如下的方法创建一个空分支。
方法1
执行以下git命令:
git symbolic-ref HEAD refs/heads/newbranch
rm .git/index
git clean -fdx
<do work>
git add your files
git commit -m 'Initial commit'
方法2
这里以github的操作为例,下面试图创建一个名为gh-pages的空分支:
$ cd repo
$ git checkout --orphan gh-pages
# 创建一个orphan的分支,这个分支是独立的
Switched to a new branch 'gh-pages'
$ git rm -rf .
# 删除原来代码树下的所有文件
rm ......
添加内容并push
注意这个时候用git branch命令是看不见当前分支的名字的,除非进行了第一次commit。
下面我们开始添加一些代码文件,例如这里新增了一个index.html:
$ echo \"My GitHub Page\" > index.html
$ git add .
$ git commit -a -m \"First pages commit\"
$ git push origin gh-pages
在commit操作之后,你就可以用git branch命令看到新分支的名字了,然后push到远程仓库。
3.2 - commit命令
3.2.1 - 修改注释
已经 commit 但还没有 push
TBD
已经 push
对于已经提交并已经 push 到远程仓库中的需要通过 git rebase
才能完成。
首先要 git rebase
到需要修改的那个 commit 的前1个 commit。假设 commit id 是 32e0a87f,运行下面的git rebase
命令:
git rebase -i 32e0a87f
在 git bash 中运行上面的命令后,会弹出编辑框,在编辑框中会分行依次显示以 pick 开头的这个 commit 之后的所有 commit message。
将需要修改的commit message之前的"pick"改为"reword",点击保存按钮,并关闭编辑框,这时会执行rebase操作。
Rebasing (1/3)
接着会再次弹出编辑框,这次编辑框中只有之前改为"reword"的那个commit message,此时修改commit message的内容,点击保存按钮并关闭编辑框,会继续执行rebase操作。
如果操作成功,会出现如下的提示:
[detached HEAD aa3b52c] Add return url
2 files changed, 1 insertion(+), 3 deletions(-)
Successfully rebased and updated refs/heads/oss.
这样就完成了git commit message的修改,然后强制push一下就搞定了。
git push --force
参考资料
3.2.2 - 撤销commit
背景
- 代码修改后已经执行了commit和push
- 希望撤销这次commit,回到到这个commit之前的状态:包括本地和远程仓库
操作
找出提交历史记录
先 git log
找出提交的历史记录
比如下面有四个commit记录:
$ git log
commit 87dabb290ae1a4e620512b7cd81d2161747c6ec9
Author: Sky Ao <aoxiaojian@gmail.com>
Date: Thu Jul 21 16:36:26 2016 +0800
add cliet builder and wrap native api; setup integration test; add first unit test case and integration test case
commit 6899dd19dbe58da6ae65fd157a791151967c16b2
Author: Sky Ao <aoxiaojian@gmail.com>
Date: Thu Jul 21 15:17:00 2016 +0800
rollback package name to etcdserverpb, otherwise etcd server will reject the request
commit 18d034b3a1e20e81ece3d2f6ba9919e8bdb3dfd4
Author: Sky Ao <aoxiaojian@gmail.com>
Date: Thu Jul 21 14:37:19 2016 +0800
change java version to 1.7
commit 4beef3ce6557a41e657c2ee4e19c6156eabd759b
Author: Sky Ao <aoxiaojian@gmail.com>
Date: Wed Jul 20 18:40:18 2016 +0800
现在需要撤销最新的这一次 87dabb290ae1a4e620512b7cd81d2161747c6ec9
提交, 回退到它的上一次 6899dd19dbe58da6ae65fd157a791151967c16b2
。
执行 reset 命令
git reset --hard 6899dd19dbe58da6ae65fd157a791151967c16b2
HEAD 现在位于 6899dd1 rollback package name to etcdserverpb, otherwise etcd server will reject the request
注意 commitid 是要撤销的commit的前一次commit的id,也就是说 reset 命令是将提交 重置 到要撤销的前一次。
reset命令执行完成后,本地仓库就重置,相当于撤销了 6899dd1
之前的所有commit。
执行强制的 push 命令
执行 push 命令,注意是需要增加 –force 来强制推送:
$ git push origin HEAD --force
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:skyao/jetcd.git
+ 87dabb2...6899dd1 HEAD -> master (forced update)
push 命令执行完成,远程仓库也就重置了。此时从远程仓库上看,在这次 6899dd19dbe58da6ae65fd157a791151967c16b2
提交之后的所有commit已经消失,相当于 git 仓库回滚到这个提交了。
如果不是master branch,则需要在HEAD后面指定远程分支的名字,如:
git push origin HEAD:learning --force
处理受保护分支
如果当前分支是 protecded 的受保护分支,则 git 服务器会拒绝强制推送,报错如下:
$ git push origin HEAD --force
Total 0 (delta 0), reused 0 (delta 0)
remote: GitLab: You are not allowed to force push code to a protected branch on this project.
To basiccloud.net:foundation/foundation-etcd.git
! [remote rejected] HEAD -> master (pre-receive hook declined)
error: 无法推送一些引用到 'git@basiccloud.net:foundation/foundation-etcd.git'
此时,需要将当前分支的 Protected 属性暂时去掉。
对于 gitlab,可以进入当前仓库的设置中的 “Protected branches” 一项,将当前 branch 的 protected 临时去掉,等这次 push 完成,再重新设置回 protected 。
参考资料
3.3 - merge命令
3.3.1 - 更新fork仓库
背景
- 在github上fork了某项目
- 原仓库有新的改动
- 想将原仓库的改动更新到自己fork的仓库
操作过程
同步代码
以netty为例:
- 源地址:git@github.com:netty/netty.git
- 我fork的: git@github.com:skyao/netty.git
按照下面的步骤:
-
为本地仓库增加一个remote, 命名为"upstream":
git remote add upstream git://github.com/dapr/dapr.git # 或者 git remote add upstream git@github.com:dapr/dapr.git
也有人推荐下面的多了–track参数的的方式:
git remote add --track master upstream git://github.com/dapr/dapr.git
-
fetch 这个upstream远程的所有分支到remote-tracking分支, 例如upstream/master
git fetch upstream
-
确认当前分支是master分支, 如果不是checkout到master分支
git branch git checkout master
-
同步upstream的修改到本地, 可以选择rebase或者merge
git rebase upstream/master git merge upstream/master
注: 推荐用merge.
-
将更新之后的版本推送到自己fork的仓库
git push -f origin master
同步tag
git fetch upstream --tags
git push --tags
参考资料
3.4 - tag命令
3.4.1 - tag命令用法
记录git中tag命令的用法。
tag命令用法
列出已有tag
git tag
git tag -l 'v1.4.2.*'
添加tag
添加轻量级标签:
git tag -a v1.4
添加含附注类型的标签:
git tag -a v1.4 -m 'my version 1.4'
推送到远程:
git push origin v1.4
或者–tags推送全部:
git push --tags
删除tag
删除本地tag:
git tag -d v1.0.0
删除远程tag:
git push origin :refs/tags/v1.0.0
资料
git官方资料
中英文两个版本:
3.5 - remote命令
3.5.1 - 解决can't push错误
如果clone时 remote 的地址信息有问题,比如通过 git clnoe git://github.com/skyao/learning-git.git
的方式 clone 下来的仓库,在改动之后push时,会报错,错误信息如下:
git push
fatal: 远程错误:
You can't push to git://github.com/skyao/learning-git.git
Use https://github.com/skyao/learning-git.git
事实上,在github 页面上,给出的clone地址是
git@github.com:skyao/learning-git.git
git@github.com/skyao/learning-git.git
和前面clone下来时使用的地址仅有一个字符的差异。
解决问题的方法,可以重新用正确的地址再clone一遍。如果已经有commit,则可以使用 remote 的 set-url 子命令直接修改remote的地址:
git remote set-url origin git@github.com:skyao/learning-git.git
sky@B-47WAMD6R-0023 learning-git % git push
Connection to github.com port 22 [tcp/ssh] succeeded!
参考资料
4 -
Github
5 -
SourceTree
sourcetree 是一个免费的git和hg客户端,支持 Mac 和 windows 。
A free visual Git and Hg client for Mac and Windows
口号:在一个非常简单的应用程序中利用 Git 和 Hg 的力量
Harness the power of Git and Hg in a beautifully simple application
SourceTree 简化了如何与 Git 和 Mercurial 存储库交互的方式,以便您可以专注于编码。 通过 SourceTree 的简单界面可视化和管理您的存储库。
- 对初级用户入门简单:对命令行说再见 - 简化您的团队的分布式版本控制,并迅速使每个人都能够快速前行
- 对专家功能强大:完美,让高级用户更加高效。查看分支机构之间的更改,stash/隐藏,cherry-pick等。
- 可视化您的代码: 眼见为实。 一次点击即可获得任何分支或提交的信息。
- 桌面上的Git和Hg:全功能的GUI,即开即用,提供高效,一致的开发流程。