1. git的四个工作区
- 工作区Working Area
- 暂存区Stage
- 本地仓库 Local Repository
- 远程仓库 Remote Repository
关系见图:
2. 5种状态
未修改(Origin):原始文件
已修改(Modified)
已暂存(Staged)
已提交(Committed)
已推送(Pushed)
操作关系图:
3. git配置
1. 三个配置文件:
- /etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。
- ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。
- .git/config 当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。
每一层都会覆盖上一层的同名配置。使用 --system, --global, --local and --file 选项操作对应的配置文件
-
git config --global user.name “username” 和
-
git config --global user.email “your email” 设置自己的信息、便于管理更改信息
-
git config --global https.proxy “” 清除proxy配置
-
git config --global alias.br branch //设置git别名
-
git config --global alias.co checkout
2. 设置git忽略的文件
cat .gitignore
# 此为注释 – 将被 Git 忽略
# 忽略所有 .a 结尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录下所有扩展名为 txt 的文件
doc/**/*.txt
4. git的基本操作
操作图:
1. 初始化项目
//基本操作流程
- git init 初始化git仓库、/.git/
- git clone git://github.com/schacon/grit.git 克隆一个仓库
查看远程配置:
- git remote -v
- git status 检查仓库文件状态
cd existing_folder
git init
git remote add origin http://git.code.oa.com/jasonye/gittest.git
git add .
git commit -m "do something."
git push -u origin master
2. 把文件添加到git暂存区
- git add octocat.txt
- git add ‘*.txt’
-
取消已经暂存的文件:
- git reset HEAD …" to unstage
-
从暂存区移除文件:
- git rm --cached … unstage文件
-
取消已进行的修改
- git checkout –
3. 提交文件到本地仓库
- git commit -m "commet message"
- git commit -m "remove all the cats"
- git commit --amend 修改上一次提交 //修改最新commit的message
- git log 查看日志
-
- 查看远程仓库
-
git remote
-
git remote add origin https://github.com/try-git/try_git.git
-
master 本地分支名字、orgin 远程名字
-
git remote show 显示所有远程库信息
-
git remote rename
-
git remote rm
3. 从本地仓库提交到远程仓库
git push [remote-name] [branch-name]
git push (远程仓库名) (本地分支名)
- git push -u origin master -u表示记住master、origin
- git push push所有的东西到仓库、
4. 从远程仓库拉取代码到本地
- git pull origin master 拉取远程改变
git fetch
-
- 从远程仓库抓取数据
- git fetch [remote-name]
fetch、pull的差别:
需要记住,fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并。参考:https://git-scm.com/book/zh/v1/Git-分支-远程分支
使用 git pull 命令自动抓取数据下来,然后将远端分支自动合并到本地仓库中当前分支。
5. 查看文件差异:
- 已修改未暂存 git diff
- 已暂存未提交 git diff --cached
- 已提交未推送 git diff master origin/master
-
- 查看本地修改、未被暂存代码、
- git diff HEAD
-
2.查看已经暂存、但是未被提交到本地仓库的代码
- git diff —-staged(和cached效果相同)
- git diff --cached
-
3.查看本地仓库和远程仓库的差别
- git diff master origin/master
具体diff差异代码阅读:http://www.ruanyifeng.com/blog/2012/08/how_to_read_diff.html
6. 几种回滚操作
git reset 和 git revert
git reset //把本地分支回滚到之前的版本
git revert //把本地分支、回滚到之前的版本,并且分享给其他人、
1. 已修改未暂存,但未 add 的文件,想变回未修改的状态
git checkout – 1.go
// 如果想把所有文件都变回未修改的状态
git checkout – .
2. 已经stage的文件 git add ,回到add前状态
git reset
git reset – .
git reset --hard 70a1e67b //按版本号回滚
git reset HEAD 1.go
// 如果想把所有文件都未 add 的状态
git reset HEAD .
已经被 add 的修改,叫做 staged changes;未 add 的叫做 unstaged changes
3. 已ci,未推送,想回到上一个 commit 重新写
已经污染了“本地仓库”,需要从远程把代码取回来
git reset --hard origin/master
// 回到上一个 commit,把这个 commit 的修改变成 unstaged changes
git reset HEAD^
// 把 unstaged changes 变回未修改的状态
git checkout – .
// 重新写
4. 已推送,想回到上一个 commit
先恢复本地仓库,然后push到远程仓库
git reset --hard HEAD^
git push -f
5. 上个方法太暴力了
// 创建一个和上个提交完全相反的提交
git revert HEAD
git push
7. 分支管理
git分支的基本内容:
https://git-scm.com/book/zh/v1/Git-分支-何谓分支
查看分支:
git branch
git branch -a //查看所有分支、包含本地与远程
git branch -r //查看远程分支
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:
git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <branch name>
删除远程分支:git push origin --delete <branch name>
2. 新建并切换到新的分支上
git checkout -b <new_branch> [<start_point>]
git checkout -b <branch> --track <remote>/<branch>
如:git checkout -b serverfix origin/serverfix
3. 切换分支
-
git checkout clean_up
-
git checkout – 恢复文件最初的状态
-
git rm ‘*.txt’ 删除所有的文件
4. 修改分支?
- git branch -m(-M) 给分支进行管理
- git branch -v 查看分支最后一次提交信息
查看已经合并到当前分支、未合并到当前分支的信息
- git branch --merged 合并的 --no-merged 未合并的信息
6. 推送到其他分支上去
如果希望和别人一起在名为 serverfix 的分支上工作,你可以像推送第一个分支那样推送它。
git push (remote) (branch):
*** 设置本地分支与远程分支的连接 ***
git push --set-upstream origin feature1
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/ dev
-
在本地创建和远程分支对应的分支,使用
git checkout -b branch-name origin/branch-name,
本地和远程分支的名称最好一致; -
建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/branch-name;
git checkout HEAD^22 //在分支之间快速移动,移动到当前的父分支上、
远程分支
git ls-remote
git remote show
远程仓库以:仓库名/分支名(remote)/(branch) 的形式命名。如origin/master分支。
git fetch
git pull = git fetch + git merge
fetch = fetch
- git commit amending
git push origin : //推送请求到远程分支
master开发模式下,和中心仓储同步时,不要使用"git pull", 请使用 “git pull --rebase” 或 “git fetch; git rebase origin/master"以保持线性历史.
8. 几种合并操作
1. 分支的合并:
git cherry-pick o/master
git rebase o/master
git merge o/master
合并clean_up分支到当前分支:
- git merge clean_up
- 冲突的合并
-
git mergetool 冲突解决图形化工具
-
git rebase //变基合并
- 合并分支到远程:
git push origin jasonye_branch:develop
留心你的暂存区或者工作目录里,那些还没有提交的修改,它会和你即将检出的分支产生冲突从而阻止 Git 为你切换分支。切换分支的时候最好保持一个清洁的工作区域。
- cherry-pick
git cherry-pick <提交号> //直接获取想要合并的提交号、
//交互式提交、–interactive
git rebase -i HEAD~4
git cherry-pick C4 C3 C2
1. rebase 分支变基的使用
git co -b bugFix
git ci -m "commit something"
git rebase master //把当前分支合并到master分支上
git rebase master topic // 把topic 分支合并到master上
实际上是取出一系列提交记录,“复制”它们,然后在另外一个地方逐个放下去。
rebase和merge一样,也是用于合并分支之间的代码
rebase操作可以把本地未push的分叉提交历史整理成直线;
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
2. git cherry-pick 用于捡取打补丁操作
对当前分支apply已有的commits
git checkout
git cherry-pick <other branch/commit id>
git相关用法
3. rebase的用法:
//获取并且合并远程任务、
git fetch; git merge o/master; git push
git pull --rebase // git fetch 、rebase的缩写
git checkout -b totallyNotMaster o/master
9. stash–用于紧急修复bug内容
暂存当前工作内容
//暂存
git add .
git stash //本地代码暂存到代码库里面
git stash list //查看当前stash列表
git stash pop //恢复stash工作内容,并且删除stash上的内容
git stash list
git stash apply //恢复stash内容,并且不删除stash上内容,上
git stash drop //删除stash上的内容
git stash apply stash@{0} //恢复指定的stash内容
#10. Tag 打标签-用于记录某个特定版本、
-
git tag 列出已有标签
-
git tag -l ‘v1.4.2.*’
git show v0.9 //查看标签信息
git tag -a v0.1 -m “version 0.1 released” 1094adb //标签说明信息
//推送标签到远程:
git push origin v1.0
git push origin --tags删除本地标签:
git tag -d v0.9远程删除
git push origin :refs/tags/v0.9 //把本地标签推送到远程
git树上移动
HEAD 记录位置:
相对引用非常给力,这里我介绍两个简单的用法:
使用 ^ 向上移动 1 个提交记录
使用 ~ 向上移动多个提交记录,如 ~3
git checkout HEAD^ //向上移动一个距离、
git checkout HEAD~4
git br -f master HEAD~3 //移动master 到 HEAD分支的前面节点、
10 远程仓库管理
git remote -v
git remote add origin git@code.byted.org:life/follow_feed_tmq.git
git remote remove master
9.git内部工作原理
1. 分布式git-分布式工作流程
疑问?
- 如何删除git上的文件?
- git文件目录乱码修改:
git config --global core.quotepath false
参考资料:
https://git-scm.com/book/zh/v1/起步
https://bingohuang.gitbooks.io/progit2/content/
SVN的失踪Merge方法:
https://blog.csdn.net/imanapple/article/details/44563881