安装完 github 后需要配置账户信息,包括 name 和 email 信息,这是必须做的步骤,以后任何的改动都会被绑定该账户信息
git config user.name
git config user.email
git config --global user.name "your Name"
git config --global user.email "[email protected]"
# 去除 --global 则本次重命名只是针对当前项目
mkdir TestGit
cd TestGit
git init
此时在 TestGit 文件夹中会新建一个 .git 的隐藏文件夹,在这个隐藏文件夹中存在对暂存区和本地仓库的记录
直接使用 https://git.xxx.com/xxx/x/xxx.git 网址进行 git 的相关操作会比较繁琐,所以可以直接给 git 网址起一个别名,例如 origin
# 查看远程仓库别名,这里的名称是本地的别名,其它主机或者远程主机并不知晓,origin是默认别名
git remote -v
# 删除远程仓库别名origin
git remote rm origin
# 新建远程仓库别名origin
git remote add origin https://git.xxx.com/xxx/x/xxx.git
# 远程仓库重命名old-origin -> origin
git remote rename origin old-origin
在本地没有该远程仓库的前提下,可以使用 git clone
命令,如果本地已经有该远程仓库了,需要使用后面的 git pull
和 git fetch
命令
# 克隆主分支,默认是克隆master分支的所有提交 --depth 1 是仅仅克隆最近一次提交
git clone --depth 1 https://git.xxx.com/xxx/x/xxx.git
# 克隆某分支
git clone https://git.xxx.com/xxx/x/xxx.git -b Feature-Branch
# 克隆所有分支
git clone https://git.xxx.com/xxx/x/xxx.git # 首先克隆主分支
git branch -r # 查看所有远程分支,会看到很多行origin/***样式的所有分支
git checkout -b feature-branch origin/feature-branch # 除了主分支外,所有其它分支,分别执行本条命令,以获取剩余所有分支
# 本地已有仓库情况下执行此命令,从远程clone某分支到本地,并新建一个分支,冒号后面是本地新建的分支
git fetch origin Feature-Perception:New-Feature-Branch
# pull命令格式如下,git pull 其实就是 git fetch 和 git merge FETCH_HEAD 的简写
# 如果本地分支为当前分支,则会强制修改当前工作区和暂存区
git pull <远程主机名> <远程分支名>:<本地分支名>
# 将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并。
git pull origin master:brantest
# 如果远程分支和本地分支都是当前分支,则可以省略为
git pull origin / git pull
git pull
与 fetch
的区别是,pull 是将远程分支拉到本地然后直接合入本地仓库和工作区,但 git fetch
是将远程分支拉取到本地新建同名分支 origin/分支名
,然后通过手动调用 merge 才能合入本地仓库,当存在冲突时,以上两种方式都会报错,都需要解冲突后才可以继续操作
直接冲突解决过程参照 冲突1 和 冲突2,线上解决冲突参考 冲突3
vscode 冲突解决过程和 github 线上解决冲突的过程参考 [跳转到11章节]
# push命令格式如下
git push <远程主机名> <本地分支名>:<远程分支名>
# 将本地的master分支推送到origin主机的master分支,如果master不存在,则会被新建
git push origin master
# 如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略
git push origin
# 建立本地分支和远程分支的关联,首先在本地建立与远程同名的分支,之后执行此命令,之后便可以直接使用push了
git branch --set-upstream-to=origin feature-perception
# 在feature分支上,执行rebase命令,相当于是想要把master分支合并到feature分支
# 并且在合并的过程中,以master分支作为基础进行变基
# 以master的最新改动作为基础,叠加上feature分支的改动,遇到冲突就解决冲突
git rebase master
# 以上命令执行完后,不会改变master分支的节点,只是会改变当前分支的提交节点分布,修改了基础节点
# 从远程同步某分支到本地对应分支,同步前先commit一下,加入--rebase的目的是整理git log图
# 修改本地分支的基础节点,使得本地修改是叠加在远程最新分支的基础上,相当于当前分支的修改是在远程分支最新节点的基础上修改的
git pull --rebase
git pull / git pull --rebase / git fetch + git merge
均不会修改当前工作区的新增文件,但会修改现有文件的工作区和暂存区
关于 rebase 命令,进一步学习可以参考 rebase1 和 rebase2
# 工作区 -> 暂存区
git add . / git add 文件 提交所有改变过的信息 / 仅仅提交“文件”
# 暂存区 -> 本地仓库
git commit -m ""
# 工作区 -> 本地仓库 local repository
git commit -a -m "" / git commit 文件 -m “” 提交所有改变过的信息 / 仅仅提交“文件”
# 从某次提交中,恢复到工作区和缓存区,原工作区和缓存区内容会丢失,不可找回,默认是最近一次commit
git reset --hard commit_id
# 从某次提交中,恢复到缓存区,原缓存区内容会移到工作区,原工作区内容会丢失,不可找回,默认是最近一次commit
# --mixed 是默认的选项
git reset --mixed commit_id
# 原工作区和缓存区内容都不会被修改,只能用于修改commit历史,切换成更早的commit后,后面的commit将会丢失
# 如果知道后面commit的id,则可以找回
git reset --soft commit_id
# 让工作区中的所有文件撤销更改,即从缓存区或本地仓库恢复内容到工作区,原工作区内容会丢失
# 具体是缓存区还是工作区取决于最近一次提交是 git add 还是 git commit
git checkout -- .
# 让工作区中的某些文件撤销更改,即从缓存区或本地仓库恢复内容到工作区,原工作区内容会丢失
# 具体是缓存区还是工作区取决于最近一次提交是 git add 还是 git commit
git checkout -- <file1> <file2>
我们有时会遇到这样的情况,正在 dev 分支开发新功能,做到一半时有人过来反馈一个 bug,让马上解决,但是新功能做到了一半你又不想提交,这时就可以使用 git stash 命令先把当前进度(工作区和暂存区)保存起来,然后切换到另一个分支去修改 bug,修改完提交后,再切回 dev 分支,使用 git stash pop 来恢复之前的进度继续开发新功能。
# 存储工作区和缓存区
git stash
# 可以为本次存储起名字
git stash save “test1”
# 查看之前存储的所有版本列表
git stash list
# 恢复具体某一次的版本到工作区和暂存区,如果不指定stash_id,则默认恢复最新的存储进度
# 如果有冲突,则需要解决冲突,解决冲突的过程会创造新的节点
git stash pop
# 查看所有分支 / 查看所有远程分支
git branch / git branch -r
# 切换分支
git checkout Feature-Branch
# 建立并切换分支
git checkout -b Feature-Branch
# 删除分支
git branch -d Feature-Branch
# 合并new-feature到当前分支,如果遇到冲突,需要解决冲突后,运行commit命令创建新的节点
git merge new-feature
线下代码,当代码出现冲突后,文件名称会变红色且有叹号提示,打开冲突文件后,如下图,绿色是当前分支的冲突部分代码,蓝色是合入分支的冲突部分代码,可以直接编辑当前文件以解决冲突,也可以点击右下角的 Resolve in Merge Editor 进入下面第二幅图界面,左上是合入代码,右上是当前分支代码,下面是 merge 后的结果,通过点击 Accept x | Accept Combination x | Ignore 可以实现合入,最后点击右下角的 Complete Merge,实现 merge 操作,实现最终的合入,合入后 git log 会出现新的合入节点。
线上代码,当想要合入代码时,点击菜单栏的 Pull requests,按照提示操作,选择需要 compare 的代码,提交后,出现如下代码,提示有 conflicts,点击 Resolve conflicts 或 web editor,进入下面第二幅图,会有 <<<<<< 和 >>>>>> 提示冲突代码,直接编辑冲突的文件,保留需要合入的代码,然后点击右上角 Commit merge,然后出现下面第三幅图,点击 Merge pull request,完成最终 merge,结果如下第四幅图表示 merge 成功。
不同公司针对 git 的用法不太相同,我们比较常用的用法是,在 gitlab 上新建仓库,仓库里有 master 和 dev 分支,leader 负责定期将 dev 分支 merge 进 master 分支,并发布版本,因为 master 分支不会进行开发,所以肯定不会存在 conflicts。开发人员在开发前在网页上从 dev 拉取自己的分支 feature_x,然后在本地 clone/fetch 自己的分支,然后进行开发。开发完成后,首先需要 git pull --rebase 一下 dev 分支,在本地处理完冲突后,直接 push 到远程自己的分支 feature_x,最后在网页上提交 merge 请求,由 leader 进行审批合入。为了保证本地 master 分支和 dev 分支的新鲜性,需要定期 pull 一下这两个分支。