一、总览
Loading...
二、五种状态间的顺序操作
1、四个区
- 工作区(Working Area)
- 暂存区(Stage)
- 本地仓库(Local Repository)
- 远程仓库(Remote Repository) 
2、五种状态
- 未修改(Origin)
- 已修改(Modified)&未追踪(Untracked)
- 已暂存(Staged)
- 已提交(Committed)
- 已推送(Pushed)
3、顺序操作
- 第零步:工作区与仓库保持一致
- 第一步:文件增删改,变为已修改状态
- 第二步:Git add ,变为已暂存状态
$ git add --all # 当前项目下的所有更改
$ git add . # 当前目录下的所有更改
$ git add xx/xx.py xx/xx2.py # 添加某几个文件
- 第三步:Git commit,变为已提交状态
$ git commit -m"<这里写commit的描述>"
- 第四步:Git push,变为已推送状态
$ git push -u origin master # 第一次需要关联上
$ git push # 之后再推送就不用指明应该推送的远程分支了
三、五种状态间的撤销操作
已修改,但未暂存
$ git diff # 列出所有的修改
$ git diff xx/xx.py xx/xx2.py # 列出某(几)个文件的修改
$ git checkout # 撤销项目下所有的修改
$ git checkout . # 撤销当前文件夹下所有的修改
$ git checkout xx/xx.py xx/xx2.py # 撤销某几个文件的修改
$ git clean -f # untracked状态,撤销新增的文件
$ git clean -df # untracked状态,撤销新增的文件和文件夹
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# xxx.py
已暂存,未提交
这个时候已经执行过Git add,但未执行Git commit,但是用Git diff已经看不到任何修改。 因为Git diff检查的是工作区与暂存区之间的差异。
$ git diff --cached # 这个命令显示暂存区和本地仓库的差异
$ git reset # 暂存区的修改恢复到工作区
$ git reset --soft # 与git reset等价,回到已修改状态,修改的内容仍然在工作区中
$ git reset --hard # 回到未修改状态,清空暂存区和工作区
git reset --hard 操作等价于 git reset 和 git checkout 2步操作
已提交,未推送
执行完commit之后,会在仓库中生成一个版本号(hash值),标志这次提交。之后任何时候,都可以借助这个hash值回退到这次提交。
$ git diff <branch-name1> <branch-name2> # 比较2个分支之间的差异
$ git diff master origin/master # 查看本地仓库与本地远程仓库的差异
$ git reset --hard origin/master # 回退与本地远程仓库一致
$ git reset --hard HEAD^ # 回退到本地仓库上一个版本
$ git reset --hard <hash code> # 回退到任意版本
$ git reset --soft/git reset # 回退且回到已修改状态,修改仍保留在工作区中。
已推送到远程
$ git push -f orgin master # 强制覆盖远程分支
$ git push -f # 如果之前已经用 -u 关联过,则可省略分支名
慎用,一般情况下,本地分支比远程要新,所以可以直接推送到远程,但有时推送到远程后发现有问题,进行了版本回退,旧版本或者分叉版本推送到远程,需要添加 -f参数,表示强制覆盖。
四、常用命令
mkdirt local-github // 创建一个空文件夹
git init // 创建git仓库
echo > file // dos命令创建一个文本文件
rm file // 删除工作区文件
git rm file // 删除文件 版本库和工作区同时删除
git rm —cached // 删除版本库文件,工作区保留
cat file // git命令查看文件内容
git status // 查看工作区中所有修改过的文件
git diff file // 查看文件的修改情况 + 为修改后的版本
git diff HEAD — file // 查看工作区文件与版本库文件的内容不同
git add file // 提交需要更新的文件到track(暂存区)
git checkout — file // 工作区的修改全部撤销
// 第一种情况:修改后没有提交到track,撤销修改就和版本库文件相同
// 第二种情况:已提交到track,又做了修改,撤销修改为最近添加到track的状态
// 第三种情况: 本地删除了文件,从版本库恢复到工作区
git reset HEAD file // 将track中的修改撤销,重新放回工作区
git commit -m ‘版本说明信息’ // 从track中提交版本
git log // 查看所有版本及相关详细信息
git log —pretty=oneline // 查看所有版本的简略信息(版本号、版本说明信息)
git log -1 // 查看最后一次提交信息(文件新增信息)
git reflog // 查看所有版本操作信息(新增版本commit、回到版本reset)
git reset —hard HEAD^ // 回退到上一个版本
git reset —hard HEAD~100 // 回退到上100个版本
git reset —hard 版本id // 回退/前进到指定版本
分支
git checkout -b dev // 创建 dev 分支并切换
git branch dev // 创建 dev 分支
git checkout dev // 切换 dev 分支
git branch // 查看分支. 为当前分支
git merge dev // 合并指定分支到当前分支
git branch -d dev // 删除 dev 分支
git branch -D dev // 强行删除,丢弃未合并的分支
全局配置
git config —global color.ui true // 显示不同的颜色
项目配置
配置用户名和密码 第一次输入后无需再次输入
.git/config 配置文档中填入下面两条配置信息
[credential]
helper = store
五、远程仓库
推送到 GitHub
- 创建 SSH Key
在
C:/user/administrator/目录下有无.ssh文件夹及文件夹内的id_rsa和id_rsa.pub两个文件 若没有 打开 Git Bash 创建 SSH Key$ ssh-keygen -t rsa -C 'youremail@example.com' - 一路回车使用默认值. id_rsa 为私钥 id_rsa.pub 为公钥
- 登陆 GitHub, Settings > SSH and GPG keys > New SSH key 在页面中填写一组SSH key,Title为任意,key为 id_rsa.pub 的内容
- 本地关联远程库并推送
// 关联GitHub的线上仓库
git remote add origin git@github.com:GitHub账户/仓库名.git
// 将本地库推送到远程 origin为远程库名 master为当前分支
git push -u origin master
// 克隆线上版本库
git clone git@github.com:GitHub账户/仓库名.git
六、Linux 创建 Git 仓库
// 创建文件夹
mkdir work
cd work
// 创建git仓库(服务端)
git init --bare
// 修改仓库的用户和用户组,否则无操作权限
chown git:git -R work
// 创建一个post-receive 勾子,用于提交代码后,自动将代码更新到 web目录
vim ./hooks/post-receive
// 写入下面内容,注意 --work-tree 后面的路径为 web目录 的绝对路径
#! /bin/sh
git --work-tree=/home/work git checkout -f
// 给 post-receive 文件 增加执行权限
chmod +x test_git/hooks/post-receive
七、忽略特殊文件
在 .gitignore 文件中填写不需要提交到版本库的文件名并推送到版本库,Git会忽略这些文件,Git status 时不会提示有文件未推送
格式如下:
# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini
# Python:
.py[cod]
.so
.egg
*.egg-info
dist
build
# My configurations:
db.ini
deploy_key_rsa
git add -f file // 强制推送,忽略 .gitignore 中规则
git check-ignore -v file // 查询哪条规则不允许该文件推送
八、命令别名
配置文件存放在 .git/config 文件 [alias] 中,一行对应一条规则
[alias]
last = log -1
git config —global alias.st status // git status => git st
git config —global alias.co checkout // git checkout => git co
git config —global alias.ci commit // git commit => git ci
git config —global alias.br branch // git branch => git br
git config —global alias.unstage 'reset HEAD' // git reset HEAD file => git unstage file
git config —global alias.last 'log -1' // git log -1 => git last
git config —global alias.lg "log —color —graph —pretty=format:’%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset’ —abbrev-commit" // git log … => git lg
九、QA
1、问题:分支合并出现冲突解决方法?
原因:
各分支对同一个文件做了修改并推送到版本库,这时合并分支时(merge)就会出现冲突错误,需要手动解决
$ git merge dev
Auto-merging 1.txt
CONFLICT (content): Merge conflict in 1.txt
Automatic merge failed; fix conflicts and then commit the result.
这时查看文件内容 cat 1.txt
Git用 <<<<<<<,=======,>>>>>>> 标记出不同分支的内容
手动修改文件后再提交
// 查看分支的合并情况
git log —graph —pretty=oneline —abbrev-commit
2、问题:当前分支正在进行但要暂停且不能提交,去操作另一个分支?
**解决:**将当前分支 stash 存储
git stash // 存储当前分支
git stash list // 查看 stash 的列表(可能会有多次存储)
git stash apply stash@{<number>} // 指定 stash list 中的一个存储恢复到工作区,但 stash list 不会删除
git stash pop // 从 stash list 恢复,会删除 stash list