刚毕业的时候用过极短期的SVN,后面就一直在用Git来作代码的版本控制了,前先后后差很少4年的时间,期间作了一些在使用Git过程当中的记录和心得,在这里分享给你们,你们或许能够从中吸取到一些有用的东西。css
不管是github,仍是gitlab,仍是其余的代码托管平台,代码管理都是用git去作的,git能够说是一名程序员的必备技能,对于工做和面试都是很是有帮助的。html
git clone -b 分支名称 远程地址
前端
git克隆远程仓库项目时若是不指定分支,只会克隆默认分支的内容。linux
git config user.name
git config user.email
复制代码
git branch(查看当前分支)
git branch -a(查看全部分支)
git checkout 分支名(切换到对应分支) 会自动将代码更新为分支代码
git branch 分支名(建立一个分支)
git branch -d 分支名(删除一个分支)
git branch -D 分支名(强制删除一个未合并的分支)
git checkout -b 分支名 [基于的分支名或commit值](切换分支并直接切换过去)
复制代码
history
git
history | grep push
程序员
git log
git log --summary
复制代码
git config --global user.name "foo"
git config --global user.email foo@gmail.com"
git config user.name "foo"
git config user.email "foo@gmail.com"
复制代码
git config --global --list
git config --local --list
复制代码
git config --local user.name
github
git reset HEAD foo.js
git checkout -- foo.js
复制代码
git diff
git diff HEAD
git diff --staged
复制代码
发现丢了修改记录,从新添加
git add "*.html"
从新提交,最终只有一个提交
git commit --amend
复制代码
git add "*.js"
web
git reset octofamily/octodog.txt
面试
git rm "*.txt"
npm
git merge 分支名
git checkout -- <filename>
git stash
git stash pop
git stash pop stash@{0}
git push origin --delete branchname
git log//找到commit hash值
git reset --hard hash值
复制代码
git stash list
git stash drop stash@{0}
git remote set-url origin git@foo.bar.com:baz/helloworld.git
git push --set-upstream origin preproduction
git push origin <tag_name>
git push --tags
git tag --list
git rm --cached -r .idea
// --cached仅仅删除index,-r(recursive)递归删除.idea目录下的全部文件
git add <file(s)>/.
git reset HEAD <file(s)>/.
git reset HEAD <file(s)>/. && git checkout -- <file(s)>/.
git add -u
git reset --hard
git diff HEAD [commit hash fragment]
git branch -D [branch name]
git rebase -i HEAD~2/hash
pick && squash
:wq!
复制代码
git remote -v
git rebase --abort
reset soft
git flow release start v0.5.0
npm version minor
git flow release finish -n
git push
git checkout master
git push
复制代码
git flow hotfix start foo
npm version patch // 注意:必定要在修复bug代码以前新增版本号
git add .
git commit -m "version change message"
git flow hotfix finish -n
git push
git checkout master
git push
复制代码
git log develop..master
复制代码
git checkout feature
git merge master
复制代码
git merge master feature
复制代码
resolve conficts
git add .
git rebase --continue
复制代码
假设merge feature到master。
git checkout master
git merge --squash feature
git commit -m "这是一次squash commit"
git push
复制代码
git reflog show <childBranch>
32c3956 (HEAD -> currentBranch, origin/fatherBranch, fatherBranch, list) childBranch@{0}: branch: Created from fatherBranch
复制代码
childBranch 是你新建的分支。 fatherBranch 是它的父分支,也就是来源分支。
...reset
git push --force
复制代码
其实使用本地分支的提交替代远程分支。
git reflog // 找出最新的commit sha1值,HEAD@{1}比HEAD@{2}新
git branch branchName <sha1>
复制代码
经过git reflog找到一个commit,而后再cherry-pick也能够。
git tag | grep v1.1.38
git tag -d v1.1.38
git push origin :refs/tags/v1.1.38
复制代码
git fetch 更新origin/*下的全部分支,在发布git flow feature前颇有用,用于更新remote分支。
git pull 主要用来更新多人合做的当前分支,多用于更新local分支。
// https://www.git-tower.com/learn/git/faq/difference-between-git-fetch-git-pull
复制代码
git fetch --prune
--prune什么意思?
Before fetching, remove any remote-tracking references that no longer exist on the remote.
复制代码
git remote show origin
复制代码
git push origin --delete feature/fix-chat-unread-msg-async
复制代码
git remote prune <name>
复制代码
git merge --abort
git revert Head/[commit hash]
1)鼠标左键点击左上角git的logo
2)找到options而且切换到text目录,将Character set设置为UTF-8
复制代码
ssh-keygen -t rsa -C "gaokai20100801@qq.com"
/c/Users/frank/.ssh/id_rsa.pub
cd ~/.ssh
ls
cat id_rsa.pub
danielkummer.github.io/git-flow-ch…
git fsck --unreachable |
grep commit | cut -d\ -f3 |
xargs git log --merges --no-walk --grep=WIP
复制代码
找到对应的commit hash值
git stash apply 1f55da93d26cd51f15f9e93351dae6b75e25e36f
复制代码
.idea/
git rm -r --cached .idea
复制代码
origin是一个变量,表明着一个git仓库地址。可使用git remote -v
查看origin表明的地址。
--system能够输出不少git的系统设置,其中最有用的是alias,例如git s表明了git status,系统全部登陆用户有用。
--global输出了git的全局设置,主要包括全局的user.name和user.email,优先级低于单个仓库中设置的user.name和user.email,当前用户全部仓库有用。
--local输出了git的项目设置,主要包括remote.origin.url以及gitflow的不少配置,只对某个仓库有用。
复制代码
add commit
工做目录---->暂存区---->版本历史
复制代码
暂存区:git已经得到了对文件的管理权限,暂存区文件有状态:new file,deleted,modified等等。
版本历史:git log查看每一次commit记录。
意外收获:
如果想很是细粒度的控制commit记录,可使用git add 指定文件,分开屡次commit,每一次commit提交一个细粒度功能的变动文件集合,屡次走文件目录 暂存区 版本历史这个流程。
复制代码
git mv README.md readme.md
复制代码
index指的是git索引,能够理解成git有文件的一个复制,仅删除index则仅删除存在于git中的文件。
working tree则是指操做系统的工做树,也就是操做系统的磁盘上存储的文件。
举两个经常使用的例子:
1. 仅删除git index中的文件,.idea等IDE隐藏的工做树文件是不能删除的:**--cached**
git rm --cached -r .idea // **--cached仅仅删除index**,-r(recursive)递归删除.idea目录下的全部文件
2. 删除index和working tree上的文件,恩断义绝
git rm 删除index上和working tree上的文件,
仅仅删除working tree不删除index的状况,不存在。
复制代码
暂存区没有能够提交到版本历史的内容。
工做区也是干净的。
复制代码
// 版本历史
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
// 暂存区
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: readme.md -> README.md
new file: helloman
// 工做区
Untracked files:
(use "git add <file>..." to include in what will be committed)
hi
复制代码
git log --oneline 简洁的commit记录
git log -n2 --oneline 最近的2次简洁的commit记录
git log --all 全部分支的历史版本信息
git log --graph 图形化查看版本演进历史
git log --oneline --all -n4 --graph 组合查看日志
复制代码
git help --web log
浏览器查看git log
的用法
gitk
无需安装第三方插件,在纯命令行下,无第三方软件状况下可用。
做者是代码的生成者,是为了版权保护。
HEAD 工做分支refs/heads/foo
config repo的配置信息
refs heads,分支;tags,标签或者里程碑
refs/heads/master 存放了什么,最新的一个commit
refs/tags/js01 存放了什么,最新的一个tag,包含一个object
objects 文件夹,2个字符的和松散的pack文件夹,存放的是tree,tree下有blob文件
复制代码
能够直接经过vim修改HEAD,config等信息,和命令的做用是相同的。
git cat-file -t/-p [hash fragment]
// -t 类型,-p 内容 只要任何文件的文件内容相同,在git眼里,它就是惟一的一个blob。
commit
tree // 位于objects目录下
blob // 位于objects目录的二级目录下,具体的文件
复制代码
commit:一个commit确定会对应一棵树,包含了根tree,author,committer,parent等等一个commit对象的信息。
tree:取出一个commit,存放了一个快照,这个快照,对应了当前项目的全部的文件夹及其文件的快照,是特定时间的整个仓库的一个状态;树里能够有blob,也能够有树,由于树是文件夹;根树是最大的树。
blob: 与文件名是否相同无关,只要内容相同,就是惟一的blob。
复制代码
git cat-file -p [commit hash fragment]
复制代码
包含tree,parent,author和commiter。
tree f06f7f36af17cb9098031c66d22a7910c0fa1bac
parent 92a55c8a5b1d38d224232ad84b9b728ae77189cb
parent eda632a1f2a3ea049c5f5268f6b2f064b71898ce
author FrankKai <gaokai20100801@gmail.com> 1548139120 +0800
committer FrankKai <gaokai20100801@gmail.com> 1548139120 +0800
Merge branch 'feature/chatBreakChange' into prerelease
# Conflicts:
# src/api/chat.js
复制代码
git cat-file -p [tree hash fragment]
复制代码
包含tree,blob。
100644 blob 015aaf344153ed7822069b2a98898b7d7a215b0d .babelrc
100644 blob 9d08a1a828a3bd2d60de3952744df29f9add27fa .editorconfig
100644 blob 080140b833db5b758b1eb869a269f4bbb068a19e .eslintignore
100644 blob 8f777c376c0314e480f9bbba273d4902810bcb11 .eslintrc.js
100644 blob 895e844218637929546ed2295ae90f991ceb5d38 .gitignore
100644 blob db7b635d23657349dbe4c33cc353ef4efd8ca960 .npmrc
100644 blob 797e871f4b8c0a3071e8b6ab2cc40b804cd2971c .postcssrc.js
100644 blob d3983c1d6a5525aae58b823448723434ca83ceed .prettierrc
100644 blob 93cc7473ab066204f3329221111a945e2dc83576 BUS.md
100644 blob defc3d9914d1af08e6670b96995261bfe1fb61a6 CHANGELOG.md
100644 blob bfd46fd4008cbe7103181fc5cd64392a74426e96 MQTT.md
100644 blob abdb55935d833dd4f4b79475aa7d63ffcb0cc9cd README.md
040000 tree f1f80f844bb80389826198a15ec0f224a53525f8 build
100644 blob 2aefa3130f4ff753b5c3e538db53b9b186f12540 index.html
100644 blob 967b8f243420a9a8a07b8f429f0a7ba874a834ad package-lock.json
100644 blob 35d9fa46f569395b25a87daef4820de42d071831 package.json
040000 tree f6bdc675a8f9af805867b5a19c263e5bbfe4c26c src
040000 tree 09e231414b91779326447a0c8d5b3421aa2308c2 static
040000 tree ad94369cfdd2038a552e44fc0abbd1738113b5e6 test
100644 blob 0b96f21c27a3759cecde02fba1e050d86a8e9a54 yarn.lock
复制代码
git cat-file -p [tree hash fragment]
就是一个具体的文件。
复制代码
分离头指针。
`git checkout [commit hash fragment]`,切换到分离头指针状态,不与任何branch或tag关联,git会认为这是不重要的,当成垃圾清理掉。
缺点:切换分支后,须要用`git branch [branch name] [commit hash fragment]`新建一个分支,不然会丢失原消息。
优势:能够基于某一次commit切出分支,而后新建一个commit,快速会退到想要的版本。
复制代码
它位于.git/HEAD。
能够指向分支或者commit,**但其实分支归根结底仍是指向了commit**。
git log 查看HEAD指针指向的分支名:`(HEAD->foo, bar, master)`
能够快速diff,`git diff HEAD [commit hash fragment]`。
父亲的父亲diff:`git diff HEAD HEAD~2`,`git diff HEAD HEAD^^`。
复制代码
git commit --amend
注意:不能在团队的集成分支上,作这样的变动,仅适用于本地。
git rebase -i [父 commit hash fragment]
reward
添加修改后的commit message
注意:不能在团队的集成分支上,作这样的变动,仅适用于本地。
复制代码
当前分支的本地代码未提交的状况下,pull了领先的远程分支代码,此时远程代码会覆盖本地代码。
git比较聪明,它不会彻底将本地的代码扔掉,即便没有人为的生成一次commit记录,也会自动为咱们在stash下生成一次记录,以避免形成重大的代码丢失。
复制代码
版本号升级 | gitflow对应 |
---|---|
bug -> patch | hotfix |
feature->minor | release |
系统重构->major | release |
可是在scrum的状况下,迭代很是快速,若全部feature都升级minor,会致使minor数字很大,该怎么处理这种状况?
只升级minor时,在commit提交信息中,添加如下信息:
类型 | 提交信息 |
---|---|
bug patch | [bug patch] |
feature patch | [feature patch |
git init
git ac
git remote add origin remote repository URL
复制代码
git参数--decorate是什么?
cherry pick是什么?
git rm -r --cache .
复制代码
rm -rf .git/hooks/
1. git checkout feature
2. git rebase master
3. resolve conflicts
4. git add .
5. git rebase --continue
复制代码
git revert 生成一个新的commit的方式回滚到上一个或者指定commit版本的代码,原理是Head继续前进。有存在被回滚掉的commit分支代码合并过来时,代码正常被合并
git reset 删除某个commit以后的代码,原理是Head向后退。有存在被回滚掉的commit分支代码合并过来时,被reset掉的代码仍然会合并上来
复制代码
缩写 | 全写 |
---|---|
gst | git status |
gaa | git add . |
gcmsg "" | git commit -m "" |
gp | git push |
glog | git log --oneline --decorate --graph |
gl | git pull |
gf | git fetch |
gfa | git fetch --all --prune |
glog --decorate=no
期待和你们交流,共同进步:
- 微信公众号: 大大大前端 / excellent_developers
- Github博客: 趁你还年轻233的我的博客
- SegmentFault专栏:趁你还年轻,作个优秀的前端工程师
努力成为优秀前端工程师!