乐趣区

Linuxgit-常用命令

作者:LogM

本文原载于 https://segmentfault.com/u/logm/articles,不允许转载~

1. 克隆

git clone < 版本库的网址 >
git clone < 版本库的网址 > < 本地目录名 >

# 克隆版本库的时候,所使用的远程主机自动被 git 命名为 origin
# 使用 - o 修改远程主机名
git clone -o < 远程主机名 > < 版本库的网址 >

2. 查看历史

# 查看历史的每一次操作
git reflog

# 查看历史 commit 
git log
git log --oneline

# 查看 commit 的修改
git show <commit_id>
git show --stat <commit_id>
git show <commit_id> <filename>

# 查看两个分支的差异
git diff <branch1> <branch2>
git diff --stat <branch1> <branch2>

# 查看某个文件的改动,还未 add
git diff <filename>

# 查看已经 add 的文件相比上一次 commit 有哪些改动
git diff --cached

3. 远程主机管理

# 列出所有的远程主机名
git remote

# 参看远程主机的网址
git remote -v

# 查看主机的详细配置
git remote show < 主机名 >

# 添加远程主机
git remote add < 主机名 > < 网址 >

# 删除远程主机
git remote rm < 主机名 >

# 远程主机改名
git remote rename < 原主机名 > < 新主机名 >

4. 分支管理

# 将远程主机新的更新取回本地,默认取回所有 branch 的更新
# 它取回的代码对你本地的开发代码没有影响(只是让 `git branch -a` 显示出远程新增的 branch,不修改本地代码)git fetch < 远程主机名 >

# 取回远程主机的特定 branch
git fetch < 远程主机名 > < 分支名 >

# 查看远程分支
git branch -r

# 查看所有分支
git branch -a

# 在 origin/master 的基础上,新建本地分支
git checkout -b newBrach origin/master
# 相当于执行
git branch newBrach
git checkout newBrach

# 查看跟踪关系
git branch -vv

# 手动建立追踪关系
git branch --set-upstream-to=origin/remoteBranch localBranch

# 删除本地分支
git branch -d <BranchName>

5. 拉回更新

# 取回远程主机某个分支的更新,再与本地的指定分支合并
# 实质上,这等同于先做 git fetch,再做 git merge
git pull < 远程主机名 > < 远程分支名 >:< 本地分支名 >

# 采用 rebase 模式,可以使用 --rebase 选项
git pull --rebase < 远程主机名 > < 远程分支名 >:< 本地分支名 >

# 如果远程分支是与当前分支合并,则冒号后面的部分可以省略
git pull < 远程主机名 > < 远程分支名 >

# 如果本地的当前分支在远程主机上已经有追踪关系的分支,可以省略分支名
git pull < 远程主机名 >

# 如果只有一个追踪的分支,则可以省略主机名
git pull

# 如果远程主机删除了某个分支,默认情况下,git pull 不会在拉取远程分支的时候,删除对应的本地分支
# 加上参数 -p 就会在本地删除远程已经删除的分支
git pull -p
# 等同于
git fetch --prune origin 
git fetch -p

6. 推送更新

# 将本地分支的更新,推送到远程主机
git push < 远程主机名 > < 本地分支名 >:< 远程分支名 >

# 如果省略远程分支名,则表示将本地分支推送与之存在 "追踪关系" 的远程分支,如果该远程分支不存在,则会被新建
git push origin master

# 如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支
git push origin :master
# 等同于
git push origin --delete master

# 如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略
git push origin

# 如果当前分支只有一个追踪分支,那么主机名都可以省略
git push

# 还有一种情况,就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要使用 --all 选项
git push --all origin

# 如果远程主机的版本比本地版本更新,推送时 Git 会报错,应当先 pull 合并代码。如果你一定要推送,可以使用 --force 选项
git push --force origin 

# git push 不会推送标签(tag),除非使用 --tags 选项
git push origin --tags

7. 代码回滚



# 文件被修改了,但未执行 git add 操作
git checkout fileName

# 同时对多个文件执行了 git add 操作,但本次只想提交其中一部分文件
# 取消暂存
git reset HEAD <filename>

# 文件执行了 git add 操作,但想撤销对其的修改
# 取消暂存
git reset HEAD fileName
# 撤销修改
git checkout fileName

# 修改的文件已被 git commit,但想再次修改不再产生新的 Commit
# 修改最后一次提交 
$ git add fileName
$ git commit --amend -m"说明"

# 已在本地进行了多次 git commit 操作,现在想撤销到其中某次 Commit
git reset [--hard|soft|mixed|merge|keep] [commit|HEAD]
# hard:重设 index 和 working directory,从 <commit> 以来在 working directory 中的任何改变都被丢弃,并把 HEAD 指向 <commit>
# soft:index 和 working directory 中的内容不作任何改变,仅仅把 HEAD 指向 <commit>。自从 <commit> 以来的所有改变都会显示在 git status 的“Changes to be committed”中
# mixed:仅重设 index,但是不重设 working directory。这个模式是默认模式,即当不显示告知 git reset 模式时,会使用 mixed 模式。这个模式的效果是,working directory 中文件的修改都会被保留,不会丢弃,但是也不会被标记成“Changes to be committed”,但是会打出什么还未被更新的报告

# 将本地的状态回退到和远程一样
git reset --hard origin/devlop

# revert 是放弃指定提交的修改,但是会生成一次新的提交,需要填写提交注释,以前的历史记录都在;# reset 是指将 HEAD 指针指到指定提交,历史记录中不会出现放弃的提交记录。
退出移动版