1、初始化git版本库(git三部曲第一步):
git init demo :在当前目录下自动创建了一个demo文件夹,并在demo文件夹下创建了一个git版本库.git
2、增加文件到版本库中(git三部曲第二步):
git add filename:将filename文件添加到版本库中
3、提交当前修改到版本库中(git三部曲第三步):
git commit -m "initialized.":-m参数设置提交说明,说明内容为"initialized."
4、查看日志:
git log
git log --pretty=fuller:全日志方式输出
git log --pretty=online:精简日志方式输出
git log --stat:包含被修改的文件列表信息
5、查看状态:
git status:可以清晰的看到工程相对于版本库的文件修改情况;
git status -s:精简格式的状态输出;
6、 恢复工作区不必要的修改 :
git clean -fd:工作区还原到和暂存区一致;
git checkout:汇总显示(只是显示,不做修改)工作区、暂存区与HEAD的差异;
git checkout .:别忘了这个命令的checkout后面还有一个“.”;这个命令会取消本地工作区中所有的修改(相对于暂存区),但是要注意的是它不会删除工作区中相对于暂存区中新建的文件或者目录。
git checkout -- filename:用暂存区中的filename文件来覆盖工作区中的filename文件。
git checkout branch -- filename:维持HEAD的指向不变。用branch所指向的提交中的filename替换暂存区和工作区相应的文件。注意这个命令会将暂存区和工作区中的filename文件都覆盖。
git checkout branch:检出branch分支。执行这个命令之后会将HEAD执行branch分支,并将用branch分支中的内容更新暂存区和工作区;
git checkout <commmit_id>: commmit_id要用实际的ID值来代替,执行这个命令后HEAD指向commmit_id,如果在之后的状态下想保留其修改和提交,可以新建一个分支,方法如下:
git checkout -b new_branch_name:新建new_branch_name分支;
要查看目前git版本库中的所有分支,使用如下命令:
git branch -v
通过合并操作命令给分支打补丁:
git merge <commmit_id>
8、建立里程碑:
里程碑有3种不同形式,包括:轻量级里程碑、带注释的里程碑、带签名的里程碑。
我们先来看简单的方式:
建立一个轻量级里程碑命令如下:
git tag tagname
建立里程碑之后在查看历史信息的时候可以加上--decorate参数同时显示里程碑信息
git log --decorate
根据里程碑信息还可以将文件进行归档,比如基于里程碑v1.0建立归档,并且为归档中的文件
添加目录前缀1.0的命令如下:
git archive --format-tar --prefix=1.0/ v1.0 | gzip > foo-1.0.tar.gz
9、查看工程中的文件和版本库中的文件的差异:
git diff:会列出每个文件中具体的内容差异(工程文件和暂存区之间);
git diff HEAD:与HEAD(当前版本库的头指针)或master分支进行比较,输出差异;这个一般在执行了git add filename之后执行git diff可能没有差异输出,但是执行git diff HEAD还是有差异输出的(工程文件和版本库之间);
git diff --cached(或--staged):(暂存区和版本库之间);
10、查看时间戳
ls --full-time .git/index
先执行git status -s
再执行 git --full-time .git/index
11、保存当前工作进度
git stash
12、恢复进度
git stash pop
13、研究对像ID
git cat-file -t 16进制数
git cat-file -p 16进制数
14、查看提交的跟踪链
git log --pretty=raw --graph 16进制数前几位即可
15、查看最早提交的ID 是在版本库中
git log --graph --oneline
重置到最早的一次提交 (
是在版本库中, 使用重置命令很危险,会彻底地丢弃历史,不能重新恢复,慎用,最好不用)
git reset --hard 最早一次的ID 7位数
16、恢复暂存区某一个文件到上一次提交的状态
git reset HEAD fiel.c
执行git reset HEAD 命令时,暂存区的目录树会重写,会被Master分支指向的目录树所替换,但是工作区不受影响
执行git rm --cached <file>命令时,<>为可选项,会直接从暂存区删除文件,工作区则不做出任何改变
git ls-tree -l HEAD
-l参数可以显示文件大小,
17、查找当前版本库中的HEAD master refs/heads/master
gind .git -name HEAD -o -name master
18、reflog挽救错误的重置
查看更改日志的设置
git config core.logallrefupdates
查看master分支的日志文件
tail -5 .git/logs/refs/heads/master
挽救命令
git reflog show master | head -5
其中参数-5是显示5条的意思
重置master为两次之前的值
git reset --hard master@{2}
查看提交历史
git log --oneline
19、reset 命令
git reset --soft HEAD^
工作区和暂存区不变,但引用向前回退一次,当对最新提交的说明或提交的更改不满意时,撤销最新的提交以便重新提交
git reset HEAD filename
仅将文件Filename的改动撤出暂存区,暂存区中其它的文件不改变,相当于对命令git add filename的反向操作
git reset HEAD^
工作区不改变,便是暂存区会回退到上一次提交之前,引用也会回退一次
git reset --mixed HEAD^
同上
git reset --hard HEAD^
彻底撤销最近的提交,引用回退到前一次,而且工作区和暂存工会回退到上一次提交的状态,自上一次以后的提交全部丢失
20、删除文件
1.在本地用rm file.c -rf
2. 执行命令git add -u 执行完成后,可以用 git status -s查看状态
3.执行提交命令git commit -m " ", 将文件删除
21、恢复删除的文件
首先查看历史提交
git cat-file -p HEAD^:filename
1.如果要恢复删除的文件,如下三个命令都可以用
a. git cat-file -p HEAD~1:filename > filename
b git show HEAD~1:filename > filename
c. git checkout HEAD~1 -- filename
2.执行 git add -A 将恢复过来的文件添加回暂存区,再用git status -s 查看状态
3.执行提交操作。执行完成后,文件将恢复
git commit -m ""
22、移动文件_改名
改名有两种方法
第一种方法
1.执行
git mv old_filename new_filename,执行完成后,用git status查看状态
2.提交git commit -m "" 就完成了
第二种法
1.执行mv old_filename new_filename
执行完成后用gti status -s查看状态
2.执行git add -A,执行完成后用gti status 查看状态
3.执行提交git commit -m "" 就完成了
如果想恢复改名的文件
1.先撤销之前测试文件移动的提交
git reset --hard HEAD^
2.撤销之后,文件又回来了
git status -s
git ls-files
23、选择性添加
git add -i
$ git add -i
staged unstaged path
*** Commands ***
1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked
5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp
What now>
24、查看历史提交次数
git rev-list HEAD | wc -l
分支的切换:
使用命令:git checkout[branch_name]
此命令可以切换分支,注意所有的stage和unstage状态都会被切一起切换,注意先用stash保存。
分支的合并:
这个操作是比较容易引起问题的,请尽量保证本地worktree比较干净再来做这一操作。有如下操作方式
a.整个分支合并
使用命令:git merge [branch_name]
使用这个命令来将branch_name指定的branch上的改动,合并到当前所在的branch。合并的轨迹可以在gitk中明显的看到。
合并两个分支,最容易产生的问题就是代码的冲突。git会提示冲突的文件,可以使用git status查看,提示unmerged。
用熟悉的编辑工具打开有冲突的文件,可以看到由<<<<<<<和======中间的,是目前所在branch的修改。========和>>>>>>>之间的,是要合并的修改。选择自己需要的部分,并移除<=>等符号,保存。
随后可以使用git add添加到stage状态,并提交即可。这样的提交因为有merge的动作在前,与普通提交是不同的,从gitk上可以看出有两条线的merge。
另外一点需要注意的是,即使不修改<=>中间的内容,也可以git add到stage,git会认为你已经merge好了。所以请一定记得首先做好所有conflict的处理!
另外一个冲突的解决方法是执行git mergetool,可以使用比如kdiff3等3路merge工具来完成merge,喜欢用图形工具的会方便一些。
b.合并单独的change
使用命令:git cherry-pick [change's SHA1]
git cherry-pick可以手工选择一些改动来集成到当前分支,是最灵活的方式。使用change的SHA1前4位即可。遇到冲突,和merge的解决方法一样。需要注意的是cherry-pick并不带来分支轨迹的变化。
分支的删除:
使用命令:git branch -d/-D
-d是删除已经合并过的branch,-D是直接删除