分支操作
- 查看分支:
git branch - 创建分支:
git branch <name> - 切换分支:
git checkout <name> - 切换到上一分支
git checkout - - 创建+切换分支:
git checkout -b <name> - 合并某分支到当前分支:
git merge <name> - 删除分支:
git branch -d <name>
add
git add *与git add -a添加所有文件git add -u除了新文件之外的所有文件git commit -ma=git add -u+git commit -m
还原操作
checkout
还原至工作区
-
从暂存区还原
git checkout .所有文件git checkout -- filename单个文件 -
从commit还原
git checkout HEAD -f所有文件git checkout HEAD -- filename单个文件
reset
从commit还原
-
还原至暂存区
git reset HEAD所有文件git reset HEAD filename单个文件 -
还原至工作区
git reset HEAD --hard所有文件 不支持单个文件
git rm --cached file_path取消某个文件的跟踪git reset --hard [commit]重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
- 一般来说 reset(Repository->stage),checkout(stage->workspace)
git revert当作撤销已经提交的更改,之后继续提交当前修改的内容,git reset --keep [commit]重置当前HEAD为指定commit,但保持暂存区和工作区不变
git stash暂存当前工作内容git stash list工作区是干净的,刚才的工作现场存到哪去了?用命令看看:git stash pop,恢复的同时把stash内容也删了:
多人协作步骤
git push origin 推送自己的修改;
- 先用
git pull试图合并;- 合并有冲突,并在本地提交;
git push origin <branch_name>推送就能成功!
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令
git branch --set-upstream-to <branch-name> origin/<branch-name>
远程交互
git fetch取回所有分支的更新git fetch <远程主机名> <分支名>取回某个分支的更新git push将当前分支推送到远程git push origin local-branch-name将某个分支推送git pull <远程主机名> <远程分支名>:<本地分支名>
git pull master=git fetch origin master+git merge origin/master
- 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
git diff
Workspace Stage Repository
git diff filename//workspace and stagegit diff --cached filename//stage and Repositorygit diff --cached commit-id filename// stage and Repository2git diff HEAD filename// workspace and Repositorygit diff commit-id filename// workspace and Repository2git diff commit-id commit-id// Repository1 and Repository2
git reset
内部会做三件事
- 修改当前分支
- HEAD指向reset的commit //若是分支,就是指向某个分支的HEAD
- 重置stage 或者workspace //若加--hard 重置workspace
git checkout与git reset --hard的区别就是第一个——修改当前分支,重要的事情说三遍。 reset会修改当前的分支,reset会修改当前的分支,reset会修改当前的分支。//除了reset HEAD
HEAD
指向当前分支的顶端commit。
一般都是通过
git checkout branch,来指向某个branch的顶点commit,如果指向了某个具体的commit.git checkout 3fdsd,则为detached HEAD,且没法修改。
gitignore
注意
build与build/的区别,若想忽略某个目录,必须在最后加/
参考链接
www.atlassian.com/git/tutoria…
git submodule
- 添加repo
git add submodule https://github.com thirdparty/XXproject
- 修改repo
vim .gitmodules
git submoudle sync
- 修改commit
cd third/party
git fetch
git checkout XX
cd ../
git add third/party
git commit -m "update submodule"
.gitmodules并不像.gitignore,后者直接就是配置文件,前者必须要同步到.git的文件夹中,就是git submodule syncsubmodule中的repo与commit是分开存放的,commit 存放在对应的submodule文件夹中。
git merge
对两个分支进行merge,会生成一个新的commit.
- 两个旧分支的HEAD到达新的commit过程中,都产生了各自的改变,分别是公共节点到对方HEAD commit的部分。
- 主分支向前推进,次分支没有变动
- 主分支的
git log中会显示次分支中公共节点到HEAD的部分。如果使用了squash,就会将次分支HEAD到公共节点的所有提交压缩成一个新的commit.revert常规的commit没有问题,但是如果是merge commit,需要指定parent commit, 通常做法git revert -m 1 HEAD- 针对merge分叉的问题,可以通过rebase指令解决。
git mirror repo
- src repo
- 依次打开 settings/repository/Mirroring repositories
- 填写Git repository URL, push, ssh public key,点击 mirror按钮
- 拷贝ssh public key
- mirror repo
- 依次打开 settings/repository/Deploy Keys
- 填写 name, 以及粘贴Deploy Keys
此时即可实现自动同步,当src repo中有分支变动时,他会自动push到mirror repo