Git 常用命令

114 阅读4分钟

分支操作

  • 查看分支: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

还原至工作区

  1. 从暂存区还原 git checkout . 所有文件 git checkout -- filename 单个文件

  2. 从commit还原 git checkout HEAD -f 所有文件 git checkout HEAD -- filename 单个文件

reset

从commit还原

  1. 还原至暂存区 git reset HEAD 所有文件 git reset HEAD filename 单个文件

  2. 还原至工作区 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 推送自己的修改;

  1. 先用git pull试图合并;
  2. 合并有冲突,并在本地提交;
  3. 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 stage
  • git diff --cached filename //stage and Repository
  • git diff --cached commit-id filename // stage and Repository2
  • git diff HEAD filename // workspace and Repository
  • git diff commit-id filename // workspace and Repository2
  • git diff commit-id commit-id // Repository1 and Repository2

git reset

内部会做三件事

  1. 修改当前分支
  2. HEAD指向reset的commit //若是分支,就是指向某个分支的HEAD
  3. 重置stage 或者workspace //若加--hard 重置workspace

git checkoutgit 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 sync
  • submodule中的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

  1. src repo
  1. 依次打开 settings/repository/Mirroring repositories
  2. 填写Git repository URL, push, ssh public key,点击 mirror按钮
  3. 拷贝ssh public key
  1. mirror repo
  1. 依次打开 settings/repository/Deploy Keys
  2. 填写 name, 以及粘贴Deploy Keys

此时即可实现自动同步,当src repo中有分支变动时,他会自动push到mirror repo