文章目录
✨基本原理
- 工作区:自己电脑上看到的项目,也就是自己写的代码。
- 暂存区:介于工作区和版本库之间的一个缓冲区(保存在
.git/index
),用户改过的代码必须先执行git add
添加到暂存区,然后才能执行git commit
将代码更改同步到版本库分支。另外,git commit -a
可以一次性将代码的更改和删除添加到缓存区并同步到版本库,但新建的文件不会添加到缓存区,还是要用git add
添加。 - 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
- HEAD:指向 master 分支的一个"游标"。图示的命令中出现 HEAD 的地方可以用 master 来替换。
假设项目结构为
|--MyProject/
|--.git/
|--text.txt
|--readme.md
🍅常用命令解读
git checkout
git checkout <filename> # 将暂存区指定文件覆盖本地
git checkout . # 将暂存区的所有文件覆盖本地,不影响新建但没添加到暂存区的文件
# checkout 指定分支名或使用-f时,将直接从版本库拉取代码覆盖暂存区和本地
git checkout master # 切换分支。将HEAD游标切换到master分支,本地和暂存区都将被覆盖为master
git checkout -f # 从版本库拉取所有代码强制覆盖暂存区和本地,不影响新建但没添加到暂存区的文件
git checkout master <filename> # 从版本库拉取指定文件覆盖本地
git branch 分支管理
git branch [branchname] # 创建分支
git branch -d [branchname] # 删除本地分支(包含未合并的更改和未推送的提交,会失败)
git branch -D [branchname] # 强制删除本地分支
git push origin --delete branch_name # 删除远程分支
git checkout [branchname] # 切换分支
git checkout -b [branchname] # 创建并切换到新分支
# 设置远程origin/master作为本地分支master的pull获取源
git branch --set-upstream-to=origin/master master
git add 从工作区向暂存区添加更改
git add [file1] [file2] # 添加一个或多个文件到暂存区
git add [dir] # 添加指定目录到暂存区,包括子目录
git add . # 向暂存区添加文件:新文件(new)、修改(modified)文件,不含删除(deleted)文件
git add -u # 向暂存区添加文件:修改(modified)、删除(deleted)文件,不含新文件(new)
git add -A # -A是--all的缩写;向暂存区添加文件:修改(modified)、删除(deleted)、新文件(new)
git commit 从暂存区提交更改到版本库
git commit -m "本次提交说明信息"
git pull
将远程指定分支 拉取到 本地指定分支上:
git pull origin <远程分支名>:<本地分支名>
将远程指定分支 拉取到 本地当前分支上:
git pull origin <远程分支名>
将与本地当前分支同名的远程分支 拉取到 本地当前分支上(需先关联远程分支,方法见文章末尾,只需关联一次)
git pull
git push
将本地当前分支 推送到 远程指定分支上(注意:pull是远程在前本地在后,push相反):
git push origin <本地分支名>:<远程分支名>
将本地当前分支 推送到 与本地当前分支同名的远程分支上(注意:pull是远程在前本地在后,push相反):
git push origin <本地分支名>
将本地当前分支 推送到 与本地当前分支同名的远程分支上(需先关联远程分支,方法见文章末尾)
git push
将本地分支与远程同名分支相关联
git push -u origin <本地分支名>
git remote
添加远程仓库
git remote add <远程别名,如origin> git@github.com:用户名/仓库名.git
帮助
当不确定某个命令的使用方法时,可以用-h
查看说明,例如git add -h
将看到git add
的用法如下
root@XD-PC:~# git add -h
usage: git add [<options>] [--] <pathspec>...
-n, --dry-run dry run
-v, --verbose be verbose
-i, --interactive interactive picking
-p, --patch select hunks interactively
-e, --edit edit current diff and apply
-f, --force allow adding otherwise ignored files
-u, --update update tracked files
--renormalize renormalize EOL of tracked files (implies -u)
-N, --intent-to-add record only the fact that the path will be added later
-A, --all add changes from all tracked and untracked files
--ignore-removal ignore paths removed in the working tree (same as --no-all)
--refresh don't add, only refresh the index
--ignore-errors just skip files which cannot be added because of errors
--ignore-missing check if - even missing - files are ignored in dry run
--chmod (+|-)x override the executable bit of the listed files
--pathspec-from-file <file>
read pathspec from file
--pathspec-file-nul with --pathspec-from-file, pathspec elements are separated with NUL character
🍉常见操作操作流程
本地首次配置git用户
要使用git进行提交代码,需要先设置名字和邮箱。其中,名字随意,只会显示在git提交日志中,而邮箱务必设置准确,是远程仓库具有权限的邮箱。
git config --global user.name "YourName"
git config --global user.email "YourEmail@gmail.com"
强制覆盖本地代码
git fetch --all # 拉取远程代码,但不合并到本地版本库分支
git reset --hard origin/master # 将远程代码覆盖本地、暂存区、本地版本库分支
配置github access ssh key
现在github不允许使用用户名+密码进行push了,推荐使用ssh-key方式。
ssh-keygen -t rsa -C "git配置的邮箱地址"
执行命令时的交互输入全都默认(直接回车)即可。默认会生成~/.ssh/
下生成两个文件:
- id_rsa 私钥,保密
- id_rsa.pub 公钥,填写到github
随后打开github个人设置,如下图所示:
点击New SSH key
之后即可看到下图所示的填写页面:
最后点击Add SSH key
提交后,即可在本地电脑自由自在的访问git仓库了~
【注意】
配置了ssh key之后,必须使用ssh拉取仓库。如果仍然使用https方式,会一直提示输入密码。
git clone git@github.com:Name/project.git
已经使用https拉到本地的仓库,可以vim .git/config
修改其中的远程仓库链接为以上格式。
🍉 开发流程举例(含评审)
以百度iCode平台为例,从本地push到远程会自动进入评审阶段(而非直接合入)。
(1)本地开发阶段
方式1:开一个新分支(适合复杂长期开发的功能)
git checkout -b dev-test
# 开发......,开发好了,暂存、提交
git add .
git commit -m "把icafe卡片关联信息贴到这"
# 前往icode自行新建分支dev-test,然后把本地代码推上去,会自动进入评审阶段
git push --set-upstream origin HEAD:refs/for/dev-test
# 评审通过后可在icode评审页面合入主分支
方式2:直接在dev分支上开发(适合短期小功能)
# 开发完准备提交代码时,注意远程可能有更新哦~
# (1)将远程代码同步到本地仓库,但不改变已编辑未提交的文件
git fetch
git reset --soft origin/dev
# (2)提交自己修改的文件,推到远程库,自动进入评审
git add .
git commit -m "icafe卡片关联信息"
git push --set-upstream origin HEAD:refs/for/dev
(2) 提交阶段
提交(add、commit)代码之前,一般要先pull一下远程代码。如果远程代码与本地修改的代码有冲突,则pull失败:
error: Your local changes to the following files would be overwritten by merge:
此时,需要先将本地代码暂存,随后pull,最后再将暂存的代码取会工作区:
git stash # 暂存本地修改内容
git pull
git stash apply # 恢复本地修改内容
(3) 评审阶段
如果评审一次性通过,则直接在icode合入即可。如果评审不通过需要改怎么办?两种方法。
方式1:在原commit上做修改
改好代码后,直接追加到最后一次commit上。评审中会自动追加一个patch以供继续评审。
git add .
git commit --amend
git push origin HEAD:refs/for/dev
方式2:撤销commit,重新提交
这样会触发icode新的评审,需要手动在icode废弃前一次评审
# 先撤销提交:
git reset --soft HEAD^
# 修改代码....., 改好后提交:
git add .
git commit -m "把icafe卡片关联信息贴到这"
git push origin HEAD:refs/for/dev