Git 操作手册
clone
git clone 代码库地址
分支查看 切换
# 1. 查看远程分支
$ git branch -r
# 2. 查看本地分支
$ git branch
# 3. 查看远程和本地分支。带*的表示正在所处分支
$ git branch -a
# 4. 建立一个分支(是在当前分支HEAD上建立)
$ git branch branch_name
# 5. 这样建立分支更常见,可建立和远程分支追踪关系的本地分支
$ git checkout -b branch_name origin/branch_name
# 6. 切换到另一个分支
$ git checkout branch_name
# 7. 设立追踪关系 本地和远程分支
$ git branch --set-upstream master origin/master
文件改动
# 1. 撤销工作目录的改动(已经在版本管理,但还没提交到暂存区的文件)
$ git checkout -- filename
# 2. 获取远程或本地分支的某个文件到当前分支呢
$ git checkout 远程/本地分支名称 指定文件
# 3. 撤销暂存区的改动
$ git reset HEAD filename
版本回退
# 1. 回退到某个版本,留有文件修改 (版本号可在git log中查看)(--hard 硬回退)
$ git reset 版本号
# 例子:文件已经commit到本地版本库,想回退到上一个版本
$ git reset HEAD^
# 撤销当前版本的修改,表示回到上一个版本。revert是作为新的commit
$ git revert HEAD
版本回退 举例
commit了两个提交,并push到了远程库。发现最后一次的commit不对,想回退到上一个commit。
# 1. 本地硬回退到上一个版本
$ git reset HEAD^ --hard
# 2. push
$ git push
此时提示被拒绝,原因是reset时本地就落后了远端一个提交,git log 看是缺少了后悔的那个提交点,这样直接push到远程是不可以的。
先不要直接push,加一个reset同步远程即可
$ git reset HEAD^ --hard
# 执行reset,同步本地分支和远程分支(但不会丢失本地更改,本地还是上边reset到HEAD^的上一版本)。之后再git log看会保留后悔点。
$ git reset origin/xx
# 接着add commit push 即可,生成新的commitid
$ git add/commit/push
比对diff
# 1. 默认是比较当前工作目录和暂存区(git必须要知道暂存区的概念)的不同
$ git diff
# 2. 只看统计哪些文件差异,不看具体内容差异
$ git diff --stat
# 3. 比较暂存区和版本库的不同
$ git diff --cached
# 4. 比较工作目录和版本库的差异
$ git diff HEAD
# 5. 比较当前分支和远程分支上这个file的不同
$ git diff HEAD origin/branch_name filename
推送+合入
# 1. 在当前分支上合并branchname
$ git merge branchname
# 2. 拉远程代码合并本地 (省略本地分支名,表示当前所在分支;如果建立了追踪关系,可以省略分支名称)
$ git pull 远程名 远程分支名称:本地分支名称
# 3. 推远程
$ git add 文件
$ git commit -m 'xx'
$ git push 远程名 本地分支名称:远程分支名称
# 4. 追加commit,已经提交到本地,但还没执行push,再接着提交代码可以复用这个commitid
$ git commit --amend
举例
有这样一个场景,某个开发分支提交了多次,但我只想合入某一个提交点到master。可以用 cherry-pick
1. git log 找到提交点
2. git checkout master
3. git cherry-pick 62ecb3(commitid)
log查看
# 1. 查看commit信息
$ git log
$ git log --pretty=oneline
# 2. 查看某一个文件的修改历史,通过列出的commitid,再执行git show commitid,查看具体修改历史
$ git log filename (git log --pretty=oneline filename)
# 3. 查看某次提交的信息
$ git show commitid
标签tag
# 1. 在当前分支的commit版本上打一个tag。tag和某个commit id对应的
$ git tag tagname
# 2. 查看各个tag
$ git tag
# 3. 查看该tagname信息
$ git show tagname
保存暂存内容
# 1. 保存当前进度,工作区恢复到当前HEAD版本内容。很方便于当前改的东西存档,去fix其他东西。
$ git stash [save message]
# 2. 查看stash的列表
$ git stash list
# 3. 弹出最新的stash。比如修复完其他分支的问题,切回后回到之前改的。该条stash list会被删除。pop也支持回到指定进度 加stashid参数即可
$ git stash pop
# 4. 把某个stashid应用到该分支上。stashid是stash list中查看,可能有多个stashid,apply用法不会删除这条stashid,应用在多个分支都想回到此进度。
$ git stash apply stash@{n}
# 5. 把某个stashid清除掉
$ git stash drop stash@{n}
.gitignore
在开发过程中,有可能产生附带的缓存文件,在部署到服务器时是没用的。此时可以在版本库中添加一个.gitignore文件。
比如以.dat为后缀的文件不想要提示是否添加了。在.gitignore文件中行内容写上.dat即可。
如果不希望自己的.gitignore文件上传,可以在该文件再追加一行.gitignore。
git配置文件
git的命令可以使用别名简化,比如每次git commit,checkout等,单词较长。可以给他们起个别名。
在 ~/.gitconfig 文件中添加。比如我的config:
[user]
name = "username"
email = "username@corpname.com"
[color]
ui = auto
branch = auto
diff = auto
status = auto
[color "branch"]
current = green
local = yellow
remote = red
[color "diff"]
meta = yellow bold
frag = magenta bold
old = red bold
new = green bold
[color "status"]
added = yellow
changed = green
untracked = cyan
[alias]
st = status
d = difftool
ci = commit
co = checkout
br = branch
hist = log --graph --pretty=format:'%Cred%h%Creset %s%C(yellow)%d%Creset %Cgreen(%cr)%Creset [%an]' --abbrev-commit --date=relative
[core]
autocrlf = input
pager =
[diff]
tool = vimdiff
[difftool]
prompt = false
[pull]
rebase = true