Git 简明笔记
学习git过程中的简易笔记
什么是git?
简单来说,git就是一种简单的源代码管理系统,它对当前文件提供版本管理功能,核心思想就是建立一个对象数据库,将历史版本信息存入这个库中。
git branch
分支是使用git过程中常用的操作之一。几乎所有的git操作流程都离不开分支
创建分支
git branch mybranch
删除分支
git branch -d mybranch
切换分支
git switch mybranch
git checkout mybranch
创建并切换到分支
git checkout -b mybranch
git add
概述
git add命令用于将变化的文件,从工作区提交到暂存区。它的作用就是告诉 Git,下一次哪些变化需要保存到仓库区。用户可以使用git status命令查看目前的暂存区放置了哪些文件。
将制定文件放入暂存区
git add <file>
将制定目录下所有发生变化的文件放入暂存区
git add <dictory>
将当前目录下的所有文件放入暂存区
git add .
参数
- -u 参数表示只添加暂存区已有的文件(包括删除操作),但不添加新增的文件
git add -u
- -A 或者-all表示把所有的修改都添加至暂存区,包括文件的新增、修改和删除
git 2.0版本开始,-A成为默认参数,比如 git add .就相当于git add . -Agit add -A
- -f 表示强制添加某个文件,不管.gitignore是否包含了这个文件
git add -f <filename>
- -p 表示进入交互模式,指定那些修改需要添加至暂存区。即使是同一个文件,也可以只提交部分变动
git add -p <文件/路径>
git cat-file
git cat-file命令显示一个Git对象文件的内容。git cat-file -p 996icu
git checkout
git checkout 有多重用途
- 切换分支
git checkout mybranch
- 切换到指定快照(commit)
git checkout <commitId>
- 将工作区的指定文件恢复到上次commit的状态
将指定文件从暂存区恢复到工作区,用来丢弃工作区对文件的修改 git checkout -- <filename> 还可以指定从某个 commit 恢复某个指定文件,这会同时改变工作区和暂存区 git checkout HEAD~ -- <filename>
- 切换到某个tag
使用 git chekout 1.0.1 切换到某个tag时,本地不得有1.0.1这个分支git checkout tags/1.0.1 或者 git chekout 1.0.1
参数
- -b 表示用于生成一个分支
·```
git checkout -b mybranch
git cherry-pick
git cherry-pick 表示复制一个提交节点并在当前分支做一次完全一样的新提交
单个commit合并
git cherry-pick <commitID>
多个连续commit合并
commit_id到commit_idn之间,包括两端:
git cherry-pick commit_id..commit_idn
commit_id到commit_idn之间,非闭包:
git cherry-pick (commit_id..commit_idn]
挑选多个commit:
git cherry-pick commit_id commit_idx commit_idy
git clone
git clone 命令用于克隆远程仓库
git clone alpha delta --bare
上面命令表示将alpha目录(必须是git代码仓库),克隆到delta目录。bare参数表示delta目录只有仓库区,没有工作区和暂存区,即delta目录中就是.git目录的内容。
git commit-tree
根据一个树对象,生成新的commit对象。
git commit-tree 16e19f -m "First commit"
git commit
git commit命令用于将暂存区中的变化提交到仓库区。
-m参数用于指定 commit 信息,是必需的。如果省略-m参数,git commit会自动打开文本编辑器,要求输入。
git commit -m "message"
git commit命令可以跳过暂存区,直接将文件从工作区提交到仓库区。
git commit <filename> -m "message"
参数
-m 表示commit提交时信息
git commit -m 'message'
-a 表示用于现将所有的工作区的变动文件,提交到暂存区
git commit -am "message"
-allow-empty 参数用于没有提交信息的 commit。
git commit --allow-empty
–amend用于撤销上一次的commit,提交一次新的commit
git commit --amend -m "change commit"
–fixup 参数的含义是,当前添加的 commit 是以前某一个 commit 的修正。以后执行互动式的git rebase的时候,这两个 commit 将会合并成一个
git commit --fixup <commit>
执行上面的命令,提交说明将自动生成,即在目标 commit 的提交说明的最前面,添加”fixup!”这个词。
–squash 参数的作用与–fixup类似,表示当前添加的 commit 应该与以前某一个 commit 合并成一个,以后执行互动式的git rebase的时候,这两个 commit 将会合并成一个。
git commit --squash <commit>
git diff
git diff命令用于查看文件之间的差异。
查看工作区与暂存区的差异 git diff 查看某个文件的工作区与暂存区的差异 git diff filename 查看暂存区与当前 commit 的差异 git diff --cached 查看两个commit的差异 git diff <commitBefore> <commitAfter> 查看工作区与上一次commit之间的差异 git diff HEAD 查看工作区与某个 commit 的差异 git diff <commit> 显示两次提交之间的差异 git diff [first-branch]...[second-branch] 查看工作区与当前分支上一次提交的差异,但是局限于test文件 git diff HEAD -- ./test 生成patch git format-patch master --stdout > mypatch.patch
比较两个分支
查看topic分支与master分支最新提交之间的差异 git diff topic master 查看自从topic分支建立以后,master分支发生的变化 git diff topic...master
git hash-object
git hash-object命令计算一个文件的git对象ID,即SHA1的哈希值。
echo "hello" | git hash-object --stdin echo "hola" | git hash-object -w --stdin
git init
git init命令将当前目录转为git仓库。
它会在当前目录下生成一个.git子目录,在其中写入git的配置和项目的快照。git log
git log命令按照提交时间从最晚到最早的顺序,列出所有 commit。
列出当前分支的版本历史 git log 列出某个文件的版本历史,包括文件改名 git log --follow [file]
查看远程分支的变动情况。
git log origin/branch
查找log,即搜索commit信息。
git log --author=authorName git log -i --grep="Something in the message"
上面代码中,-i参数表示搜索时忽略大小写。
查看某个范围内的commitgit log origin/master..new [old]..[new] - everything you haven't pushed yet
美化输出。
git log --graph --decorate --pretty=oneline --abbrev-commit
—graph commit之间将展示连线
—decorate 显示commit里面的分支
—pretty=oneline 只显示commit信息的标题
—abbrev-commit 只显示commit SHA1的前7位
参数
— –oneline
git log默认输出每个 commit 的详细信息,为了节省空间,–oneline参数让输出时,每个 commit 只占用一行。git log --oneline --decorate
git ls-files
列出没有被.gitignore忽视的文件
git ls-files --other --ignored --exclude-standard
git merge
将当前分支合并到指定分支。
git merge develop
将当前分支与develop分支合并,产生的新的commit对象有两个父节点。
如果”指定分支”本身是当前分支的一个直接子节点,则会产生fast-forward合并,即合并不会产生新的节点,只是让当前分支指向”指定分支”的最新commit。
Git合并所采用的方法是Three-way merge,及合并的时候除了要合併的兩個檔案,還加上它们共同的父节点。这样可以大大減少人為處理 conflict 的情況。如果采用two-way merge,則只用兩個檔案進行合併(svn默认就是这种合并方法。)
git pull
合并指定分支到当前分支
git pull . topic/branch
即使当前分支有没有 commit 的变动,也可以使用git pull从远程拉取分支。
git rebase
git rebase 将当前分支移植到指定分支或指定commit之上。
git rebase -i <commit>
互动的rebase。
git rebase -i master~3
参数
- –autosquash参数用于互动模式,必须与-i参数配合使用。它会使得以前通过git commit –fixup和git commit –squash提交的 commit,按照指定的顺序排列(实质是选择提交说明以以fixup!或squash!开头的 commit),即–fixup的 commit 直接排在它所对应的 commit 的后面。
- –continue参数用于解决冲突以后,继续执行 rebase。
git rebase --continue
- -i参数会打开互动模式,让用户选择定制rebase的行为。
git rebase -i develop
git ref-parse
显示某个指示符的SHA1哈希值。git ref-parse HEAD
git remote
为远程仓库添加别名。
git remote命令的实质是在.git/config文件添加下面的内容。显示所有的远程主机 git remote -v 列出某个主机的详细信息 git remote show name
git remote add bravo ../bravo [remote "bravo"] url = ../bravo/
git reset
git reset命令用于将当前分支指向另一个位置。
如果不指定回滚的位置,那么等同于撤销修改。将当期分支的指针倒退三个 commit,并且会改变暂存区 git reset HEAD ~3 倒退指针的同时,不改变暂存区 git reset --soft HEAD~3 倒退指针的同时,改变工作区 git reset --hard HEAD~3
撤销上一次向暂存区添加的所有文件 git reset 无任何效果 git reset --soft 同时撤销暂存区和工作区的修改,回复到上一次提交的状态 git reset --hard 撤销上一次向暂存区添加的某个指定文件,不影响工作区中的该文件 git reset -- <filename>
参数
- soft: 不改变工作区和缓存区,只移动 HEAD 到指定 commit
- mixed: 只改变缓存区,不改变工作区。这是默认参数,通常用于撤销git add
- hard:改变工作区和暂存区到指定 commit。该参数等同于重置,可能会引起数据损失。git reset –hard等同于git reset –hard HEAD。
- -p表示键入交互模式,指定暂存区的哪些部分需要撤销。
git revert
git revert命令用于撤销commit。git revert <commitID>
git rm
git rm命令用于删除文件。
解除追踪某个文件,即该文件已被git add添加,然后抵消这个操作。
git rm --cached <fileName>
git show
git show命令用于查看commit的内容
输出某次提交的元数据和内容变化
git show [commit]
git stash
git stash命令用于暂时保存没有提交的工作。运行该命令后,所有没有commit的代码,都会暂时从工作区移除,回到上次commit时的状态。
它处于git reset –hard(完全放弃还修改了一半的代码)与git commit(提交代码)命令之间,很类似于”暂停”按钮。
暂时保存没有提交的工作
git stash
列出所有的暂时保存的工作
git stash list
取出暂时保存的工作
git stash apply stash@{1}
恢复最近一次暂时保存的工作
git stash pop
丢弃最近一次的暂时保存的工作
git stash drop
删除所有的stash
git stash clear
git tag
git tag命令用于为 commit 打标签。Tag 分两种:普通tag和注解tag。只有annotated tag 才會產生 object。
git tag tmp # 生成.git/refs/tags/tmp
git tag -a release
git tag -a [VERSION] -m "released [VERSION]"
上面代码表示为当前commit打上一个带注解的标签,标签名为release。
普通标签的写法。
git tag 1.0.0
git push --tags
git tag v0.0.1
git push origin master --tags
git update-index
将工作区的文件加入缓存区域。
git update-index --add --cacheinfo \
100644 5c1b14949828006ed75a3e8858957f86a2f7e2eb hola.txt
git update-ref
git update-ref命令用于更新一个指针文件中的Git对象ID。
git update-ref refs/heads/master 107aff
git write-tree
git write-tree命令用于根据当前缓存区域,生成一个树对象。
git write-tree
以上内容根据学习阮一峰 Git 教程)时学习并记录部分内容。