git的安装请自行百度。
前期配置
以gitee为例,需要先注册账号,然后在网页端新建一个仓库。仓库建好后,点击这里的按钮,就会弹出如下窗口,都不用百度命令,这里直接就能复制使用。
建议先在本地终端配置name和email,email一定要和网页端的邮箱一致,name允许不同。
git config --global user.name 'xxxx'
git config --global user.email 'xxxxxx@163.com'
一、https协议
如果选择https clone,需要每次输入账号和密码,可通过以下命令设置免密:
git config --global credential.helper store
二、ssh协议
你看,网站给的很清楚,照着操作就行。
三、本地操作
以上两种方式都是直接git clone代码仓到本地,自动就和远程仓库建立联系了;还有一种方式,可以先在本地创建仓库,然后手动和远程仓库建立联系,虽然这种方式比较麻烦,也不常用,但还是介绍一下。
git init # 找一个干净的目录,执行初始化命令
git remote add origin https://gitee.com/ceshiyan/git_test.git # 和远程仓库建立联系
需要注意,这种方式,第一次推送时,要带上-u参数设置上游分支:
git add .
git commit -m 'test'
git push -u origin master
或者在推送前,手动创建分支对应关系 :
git branch -u origin/分支a # 将当前分支和远程分支a建立跟踪关系
你看,这种方式就是比较麻烦,我们不推荐使用哈。使用git clone命令自动就处理了远程仓库和分支对应关系。
四、其它配置
git允许配置一个commit模板,并指定打开模板的应用程序,这样每次提交都会用应用程序打开这个模板,可直接编辑,比较方便。
git config --global commit.template C:\Users\86182\gitcommit_template
git config --global core.editor "notepad"
查看当前已有的配置,家目录下打开.gitconfig文件或通过git config --list命令。
git常用命令
git remote -v # 查看关联的远程仓库
git remote show origin # 查看远程仓库信息,更为详细
git remote rm origin # 同git remote remove origin 删除和远程仓库的关联关系
git remote prune origin # 删除本地有但在远程库已经不存在的分支
git branch # 查看本地分支, *标识所在分支
git branch -r # 查看远程分支
git branch -a # --all 查看本地和远程所有分支
git branch -vv # 查看本地分支和远程分支的跟踪关系
git branch -u origin/分支a # 将当前分支和远程分支a建立跟踪关系
git branch --set-upstream-to=origin/1050 1050 # 本地分支追踪远程分支,最后的1050代表本地分支,可以省略(不能是不存在的本地分支)
git branch --track patch-1 origin/patch-1 # 创建新分支patch-1, 并追踪远程分支,但不切换过去;
# 这三个命令都不会同步内容,还需要git pull
git checkout -b patch-1 origin/patch-1 # 创建patch-1本地分支且同步远程分支内容,并切到patch-1分支,其中git checkout -b patch-1 相当于 git branch patch-1 + git checkout patch-1;
git branch -d new # 删除本地分支,要切换到其他分支以后才能删除
git push origin :new #远程分支前加冒号,代表删除远程分支
# 提交三件套:add 、commit 、push
git add ./git add {目录}/git add -u # 添加所有改动、添加指定目录、添加变更文件
git commit/git commit -m '提交内容'
git push origin <branch> # 推送到远程仓库
# 有的仓库是不允许直接push的,需要git review之后,管理者+2之后才允许合入
sudo apt install git-review
git review -r origin <branch> # 将git push替换为git review
# 仓库都是多人合作,我们提交前,需要先pull一下远程的改动到本地,看下是否冲突,所以完整的提交流程应该是这样:
git stash # 将本地已有的改动储存一下
git pull --rebase # 拉取远程的改动
git stash pop # 将本地改动放开,检查是否冲突,若冲突需要手动处理
git add .
git commit
git review -r origin <branch>
# 追加同一笔提交
git commit --amend
# git reset撤销
git reset commitId # 默认参数是--mixed,这种方式会将repository和stage都回退,变更文件在workspace中保留更改
git reset --soft commitId # 这种方式只回退repository,变更文件保留在workspace和stage中
git reset --hard commitId # 这种方式repository和stage和workspace都回退,变更的文件恢复到之前状态
git reset HEAD # HEAD 表示当前版本,HEAD^ 上一个版本,HEAD^^ 上上一个版本,HEAD~0 表示当前版本,HEAD~1 上一个版本
git reset HEAD <文件名> # 用于撤销add后的文件
git reset -- <文件名> # 用于撤销add后的文件
git rm --cached 文件名 # 用于撤销add后的文件
git reset HEAD # 移除所有暂存区的文件
# git log 查看提交记录
git log # 按时间先后列出
git log -p # -p或--patch参数代表会展示每次提交的差异
git log -p -2 # -2代表仅展示最近2次的提交数据
git log -stat # -stat参数展示每次提交的简略统计信息,包括差异和汇总
git log --pretty=format # --pretty参数代表可以格式化输出结果
git show 提交id # 可以详细查看某一次提交的具体内容
# 在项目目录执行以下命令,会下载子模块仓库到当前目录
git submodule add git@gitee.com:ceshiyan/lib.git --首次添加一个子模块(会生成.gitmodules文件)
# .gitmodules文件一般会同步到远程,当一台新机器同步该仓库代码时,因有了.gitmodules文件,可直接通过以下命令下载子模块代码:
git submodule update --init --recursive
git submodule update --remote # 更新子模块为最新一笔提交,在git_test仓库中,子模块记录是lib@45yhh67形式,如果不执行该命令,那子模块会永远在45yhh67这笔提交位置。(lib会添加到.gitignore中)
面试最常问的git merge和git rebase
细心的小伙伴会发现,我上面命令用的是git pull --rebase,那其实还有一种是git pull --merge,这两种到底有啥区别呢?
D---E test
/
A---B---C---F master
在B位置处,新建一个test分支,进行了D和E两次提交,而master分支也进行了C和F两次提交,现在想在master分支上将test分支的改动合并,有两种方式:
D--------E
/ \
A---B---C---F----G
master分支上执行 git merge命令,会多出一个G的提交;git分支看起来比较混乱,但是清楚各个记录的来源与时间节点。
A---B---D---E---C'---F' test, master
master分支上执行 git rebase命令, 会先变基,将D和E的改动合入,在这个基础上再合入C和F,可能会冲突,解决冲突后就是C' F',rebase的提交记录是一个线性,但从哪里开始的分支不清楚且提交先后顺序错乱。
git merge或git rebase 一般是两个本地分支的合并;
git pull --merge == git fetch + git merge origin/<branch>
git pull --rebase == git fetch + git rebase origin/<branch>