文章目录
0. 前言
- 官网相关资料
- 其他资料:
- 《阮一峰 - 常用 Git 命令清单》
- 《廖雪峰 - Git教程》
- https://www.cnblogs.com/USTC-ZCC/p/11163292.html
1. 总体介绍
- 在使用Git时,常用的分区有:
- 工作区(Workspace):用户直接操作的的文件。
- 暂存区(Index / Stage):在
./.git/index/
路径中,包含add/rm后、commit前暂存的数据。 - 本地仓库(Repository):在
./.git/
路径中,包含之前版本的信息。 - 远程仓库(Remote):
- 盗用《阮一峰 - 常用 Git 命令清单》中的图。
2. 常用命令
2.1. 基本操作
- 新建本地仓库:在新建好的文件夹目录下运行
git init
- 克隆仓库:
git clone xxx
- 查看当前状态:
git status
2.2. 工作区、暂存区、本地仓库
- 从工作区到暂存区:add/rm/mv 命令
git add [file1] [file2] ...
git add [dir]
git add .
git rm [file1] [file2] ...
git mv [file-original] [file-renamed]
- 从暂存区到工作区:
git reset HEAD <filename>
- 暂存区中将撤销对应修改,工作区中有等待提交的内容。
- 工作区中,若对应文件没有任何修改,则会将暂存区中的修改更新到工作区中。
- 工作区中,若对应恩建有修改,则不会将暂存区中的修改更新到工作区中。
- 总的来说,一般会导致工作区中有等待提交的修改。
git checkout -- <filename>
- 这种方法是将暂存区或本地仓库中的内容更新到工作区中,也就是撤销工作区中的更新。
- 若暂存区中有等待commit的内容,则会将本地工作区中的内容改变为暂存区中的内容。
- 若暂存区中没有数据,则会将本地工作区中内容改变为最新commit的内容。
- 总的来说,一般会导致工作区中没有需要提交的内容。
- 从暂存区到本地仓库:commit 命令
git commit -m [message]
git commit [file1] [file2] ... -m [message]
- 从本地仓库到暂存区
git reset --soft xxx
- 注意,该命令是撤销 commit,但保留该commit中修改的暂存区信息。
- 从本地仓库到工作区:
- 与
从暂存区到工作区
中相同的git checkout -- <filename>
。 git reset --hard HEAD^
:- 该命令可以在改变本地仓库的同时,改变工作区内容。
- 将工作区内容改变为指定版本的本地仓库内容。
- 工作区中没有需要提交的内容。
- 与
2.3. 本地仓库与远程仓库
- 从本地仓库到远程仓库:push 命令。
- 从远程仓库到本地仓库:clone/fetch 命令。
- pull命令既把远程仓库的内容更新到本地仓库中,又把远程仓库的内容更新到工作区中。
2.4 分支
- 分支基本操作:
- 查看本地分支:
git branch
- 新建本地分支:
git branch new_branch_name
- 选择本地分支:
git checkout new_branch_name
- 新建分支并选择:
git checkout -b new_branch_name
- 等价于两条命令:
git branch new_branch_name
,git checkout new_branch_name
- 查看本地与远程分支:
git branch -a
- 删除本地分支:
git branch -d new_branch_name
- 查看本地分支:
2.5. 堆栈
- 作用:当突然有事情,需要临时保存工作区和暂存区的数据保存。
- 常用命令:
git stash
:将工作区和暂存区的数据保存到堆栈中。git stash pop
:将堆栈中的数据恢复到工作区中。git stash list
:堆栈清单。
2.6. 分支与远程仓库的结合
- 拉取远程repo特定分支到本地特定分支
- 说白了就是 git pull/fetch 命令详解
git pull <远程主机名> <远程分支名>:<本地分支名>
- 实现的功能就是将远程仓库的数据拉到本地仓库。
git pull
等价于git fetch
+git merge
。- 冒号之后可以省略,所选的本地分支就是
当前分支
。
git fetch <远程主机名> <远程分支名>
默认会建立一个新的本地分支,名为<远程主机名>/<远程分支名>
- 将指定本地分支推送到远程仓库的特定分支。
git push <远程主机名> <本地分支名> <远程分支名>
- 省略远程分支名,则表示推送到追踪关系的远程分支(一般名称相同),如果远程分支不存在则新建,例如
git push origin master
- 省略本地分支,则表示删除远程分支,例如
git push origin : dev
- 省略远程分支与本地分支,表示将本地分支推送到远程主机中对应的分支,如
git push origin
- 如果只有一个远程分支,那远程分支名也可以省略,功能如上一条相同,如
git push
2.7. 合并(merge)
- 简单合并:
- 在branch1执行命令
git merge branch2
,意思是在branch1的基础上,合并branch2。 - 如下图(盗用这里的图),如果branch1是下图中的master,branch2是下图中的dev,则可以直接合并。
- 在branch1执行命令
- 冲突处理:
- 如下图(盗用这里的图),如果在master中执行
git merge feature1
,则会提示文件存在冲突,需要手动处理。 - 手动处理后,需要重新add文件并commit。
- 举一个例子说明冲突文件的形式:
=======
前是master分支,后面是feature1分支。- 在VSC中也可以轻松处理。
- 如下图(盗用这里的图),如果在master中执行
<<<<<<< HEAD
first line line
second line
=======
first line
second line line
>>>>>>> feature1
2.8. 配置相关
- 设置 global 配置:
git config --global --add user.name xxx
- 删除 global 配置:
git config --global --unset user.name
- 查看配置:
git config --system --list
git config --global --list
git config --local --list
3. 碰到的一些实际情况
3.1. folk后更新最新代码
- 方法一 - Github中鼠标操作
- 点击folk库中的 new pull request。
- 左边改为folk的结果,右边改为原始github repo,然后点击 create pull request。
- 最后 create pull request 即可。
- 点击folk库中的 new pull request。
- 方法二 - 命令:
git remote add upstream <original repo url>
git fetch upstream
git merge upstream/master
git push origin master
3.2. 下载子模块中代码
- 参考这里
- 方法一
- 最普通的方法:
git clone --recurse-submodules git://github.com/foo/bar.git
- 在 v2.8 后好像可以设置
-j
选项,如git clone --recurse-submodules -j8 git://github.com/foo/bar.git
- 最普通的方法:
- 方法二
- 如果clone好了当前模块,但没有clone子模块,可以运行
git submodule update
- 这也可以用在网络不好的时候:
- 情况描述:原始模块下载好了,子模块下载到一半失败了
- 解决方法:
- 通过
git status
看看下载失败的模块是什么 - 通过
git checkout -- /path
删除失败的模块 - 运行
git submodule update
继续下载尚未获取成功的子模块
- 通过
- 如果clone好了当前模块,但没有clone子模块,可以运行
3.3. 多人同时使用一台服务器
- 问题一:每个用户都想要各自的user.name/user.email,要怎么处理?
- 默认情况下,git环境中只有一个 global user.name/user.email,即通过
git config --global user.name xxxx
这样设置的。 - 其实,每个 git 项目都可以设置自己的 user.name/email。有两种实现方法:
- 方法一:在git项目中设置
git config user.name "xxx"
和git config user.email "xxx"
- 方法二:在
.git/config
文件中添加内容,如下所示:
- 方法一:在git项目中设置
- 默认情况下,git环境中只有一个 global user.name/user.email,即通过
[user]
name = irving
email = irvingzhang0512@gmail.com
- 问题二:想同时使用多个
id_rsa/id_rsa.pub
- 需要构建 ssh 的配置文件,默认在
~/.ssh/config
中。 - 配置文件结构如下
Host
是别名,之后的git pull/push
操作会用到。HostName
是实际用到的路径,如github.com/gitlab.com/gitee.com
等User
我也不知道在这个场景下有什么作用。IdentityFile
指定私钥。
- 之后在git中的操作是
git clone git@h1:gitlabusername/gitlabreponame.git
等价于使用id_rsa
执行git clone git@gitlab.com:gitlabusername/gitlabreponame.git
git remote add origin h2:githubusername/githubreponame.git
等价于使用id_rsa2
执行git remote add origin github:githubusername/githubreponame.git
- 需要构建 ssh 的配置文件,默认在
Host h1
HostName gitlab.com
User u2
IdentityFile ~/.ssh/id_rsa
Host h2
HostName github.com
User u1
IdentityFile ~/.ssh/id_rsa2