git 实用命令
git 实用命令
记录一下常用和实用的git命令,持续更新.
1.与项目的git仓库建立连接
> git clone git://github.com/xxxxxx/xxxx.git
可以直接通过url方式下载并创建一个本地仓库,与远端关联,或者在已有项目代码的基础上,通过init操作来初始化。
init会创建.git文件夹,里面包含git所需数据。 remote add可以与远程仓库建立连接,并给这个远程库起个别名
> git init
> git remote add origin git://github.com/xxxxxx/xxxx.git
2.拉取代码
- 从origin远端拉取master分支代码,不合并,可以通过git checkout FETCH_HEAD 和 diff 查看分支内容,merge会把temp分支代码合到当前分支
> git fetch origin master
> git temp
- 将远程master分支代码合到当前(或temp)分支,git pull = git fetch + git merge FETCH_HEAD
> git pull origin master<:temp>
merge操作会将两个分支代码合并,并提交一个新的commit,这样整个提交记录树略显冗余,不够优雅,所以我们通常都是通过rebase来合并提交,rebase的原理就是将本地提交但未push的commit暂存起来,将远程新的commit追加到本地的代码库中,然后再将暂存的commit追加到代码中,成为最新的commit。这个过程中当然可能会有冲突,根据提示,修改冲突,add,然后continue
- 作用同上条命令,只是选择了rebase方式,而不是merge
> git pull --rebase origin master<:temp>
- 关于冲突,修改起来也很简单 <<< 到 === 使我们本地的修改, === 到 >>> 是远程的修改,我们直接编辑冲突代码,git add,然后再根据相应提示来操作(在不同情况可能操作会不一样)
<<<<<<<<<<<<< HEAD
......
=============
........
>>>>>>>>>>>>> feature
3.提交代码
我再code过程中比较常见的提交流程:
> git status
> git add 项目文件
> git commit -m "xxxxxx"
* 将没有提交的,但有修改的文件先暂存起来,以便后面pull操作
> git stash
* 在push前,习惯先pull一下代码,解决冲突,如果有冲突,直接修改冲突文件 git add
> git pull --rebase origin remote_branch_name(master)
* 如果之前用stash保存的,修改完add,再stash,覆盖掉stash里的
> git push origin HEAD:refs/for/master
4.退回操作相关
- 查看文件修改
> git diff // 查看所有文件具体修改
> git diff --stat // 查看文件修改列表
> git diff a.txt // 查看某个文件具体的修改
- 如果在编辑阶段,想撤销某个文件的修改
> git checkout -- a.txt // 将a.txt文件退回到上次commit状态
> git checkout . // 撤销所有修改
> git clean -fd // 清理所有untrack文件
- 如果在添加阶段想撤销某个add文件
> git add -i // 根据提示输入r,然后输入撤回文件编号,回车,最后回车结束
- 想撤回到某次提交
> git reset <commit-id> // 此次commit-id之后的代码会变成已修改文件
> git reset --hard <commit-id> // 强制回到这个版本,之后的修改全部被冲掉
5.其他操作
- 修改最后一个提交,补交
> git commit —-amend
- 查看某个文件被修改历史
> git log --pretty=oneline 文件名
> git show (hash) 详细改动
> git show --stat (hash) 文件列表
- 更细颗粒度的查看每一次commit的信息, 通过--amend提交的也可追踪到,可以通过reflog找到相应的commitId,reset
> git reflog
- 查看stash 具体内容
> git stash list
> git stash show stash@{0} -u // 查看某次暂存代码,-u显示详细内容
- pull和push详细参数
> git pull <远程主机名> <远程分支名>:<本地分支名>
> git push <远程主机名> <本地分支名>:<远程分支名>
// 以下省略规则对于pull和push都适用
// <本地分支名>可省略,默认当前分支;
// 如果存在track,<远程分支名>可省略
// 如果只有一个remote,<远程主机名>可省略
> git push origin :master // 删除远程分支
# 等同于
> git push origin --delete master
- pre-commit插件,养成良好的codestyle是一个coder的良好素养,git官方给出通过hooks的pre-commit.sample
- 切换远程分支,最简洁的方式,在本地创建分支xxxx,-t或--track,是建立一个track,原远程分支建立关联
> git checkout -t origin/xxxx
- 【拓展】.git 文件夹存放什么信息?
-rw-r--r-- 1 cj staff 1696 5 20 18:41 COMMIT_EDITMSG //最近一次提交的commit message
-rw-r--r-- 1 cj staff 88 5 20 18:42 FETCH_HEAD
-rw-r--r-- 1 cj staff 25 5 20 18:42 HEAD // 当前所在分支
-rw-r--r-- 1 cj staff 41 5 20 18:42 ORIG_HEAD // 当进行一些有风险的操作的时候,如reset、merge或者rebase,记录上次提交的commit-id
-rw-r--r-- 1 cj staff 360 5 16 10:05 config //配置信息,包括remote信息
-rw-r--r-- 1 cj staff 73 7 13 2017 description
drwxr-xr-x 14 cj staff 448 7 20 2017 hooks // 钩子,可以进行一些脚本操作
-rw-r--r-- 1 cj staff 3452216 5 20 18:43 index // 索引中包含一个列表,列表根据文件名、文件模式和文件元数据进行了排序,以便快速检测文件的变化,可以通过 'git ls-files --stag' 查看index
drwxr-xr-x 4 cj staff 128 11 28 09:56 info
drwxr-xr-x 4 cj staff 128 11 28 09:56 logs
drwxr-xr-x 260 cj staff 8320 12 31 16:42 objects // 每次提交的hash作文件名来存储,通过头两位建文件夹的方式索引
-rw-r--r-- 1 cj staff 3476 2 19 10:17 packed-refs // refs的打包
drwxr-xr-x 7 cj staff 224 5 20 18:43 refs // 分支