经过命令 git init 把这个目录变成git能够管理的仓库html
git的工做流程通常是这样的:git
1、在工做目录中添加、修改文件;segmentfault
2、将须要进行版本管理的文件放入暂存区域;安全
3、将暂存区域的文件提交到版本库。fetch
首先新建一个文件readme.txt,把文件提交到仓库:url
git add readme.txt git commit -m "description"
若是有大量文件进行改变,所有进行add,则使用 git add .。
若是想add并commit,则使用 git commit -a -m "Changed some files"。
git commit 命令的-a选项可将全部被修改或者已删除的且已经被git管理的文档提交到仓库中。
千万注意,-a不会形成新文件被提交,只能修改。
咱们如今可使用git show命令查看这一提交详细信息。spa
若是想查看所有提交信息,则使用git log。3d
git log git log --pretty=oneline
如今改变readme.txt文件,添加一些内容,使用git status命令看看结果。指针
git status命令可让咱们时刻掌握仓库当前的状态。code
虽然 Git 告诉咱们 readme.txt 被修改了,但若是能看看具体修改了什么内容,天然是很好的。好比你休假两周从国外回来,第一天上班时,已经记不清上次怎么修改的 readme.txt,因此,须要用git diff readme.txt这个命令看看。
git diff <file> # 比较当前文件和暂存区文件差别 git diff <id1><id1><id2> # 比较两次提交之间的差别 git diff <branch1> <branch2> # 在两个分支之间比较 git diff --staged # 比较暂存区和版本库差别 git diff --cached # 比较暂存区和版本库差别 git diff --stat # 仅仅比较统计信息
git的撤销操做:reset、checkout和revert
这三个命令均可以用于撤销。
reset和checkout能够做用于commit或者文件,revert只能做用于commit。
1.reset
git checkout hotfix git reset HEAD~2 git push -f
git reset --hard HEAD^ //回退上一个版本 在Git中,用HEAD表示当前版本。 git reset --hard HEAD~100 //往上100个版本
git reset用于撤销未被提交到remote的改动,即撤销local的修改。除了移动当前分支的HEAD,还能够更改workspace和index:
--soft:修改HEAD,不修改index和workspace。
--mixed:修改HEAD和index,不修改workspace。默认行为。
--hard:修改HEAD、index、workspace。
git reset --mixed HEAD把index的内容退回到workspace中。
git reset --hard HEAD把index和workspace的修改所有撤销。
2.revert
$ git checkout hotfix $ git revert HEAD^^
git revert <普通commitId> git revert <merge commitId> -m <parent> // 必须选择合并自哪一个分支,通常为 1,2,可经过git show <merge commitId> 展现
revert经过新建一个commit来撤销一次commit所作的修改,是一种安全的方式,并无修改commit history。
revert用于撤销committed changes,reset用于撤销uncommitted changes。
3.checkout
checkout做用于commit级别时,只是移动HEAD到不一样的commit。若是有unstaged的文件,git会阻止操做并提示。这对于快速查看文件旧版原本说很是方便,但若是你当前的HEAD没有任何分支引用,那么这会形成HEAD分离。所以,在为分离的HEAD添加新的提交时候你应该建立一个新的分支。
参考连接
1.git reset
1)暂存区回退
git reset [file] git reset HEAD readme.txt
2.git checkout
1)工做区回退
若是比对后,发现此次改动不是咱们想要的,那么咱们能够回退到未修改以前:
git checkout readme.txt git checkout . git checkout -- readme.txt // 以防判断成分支
2)用指定commit提交的内容覆盖工做区,并非真正的回退
git checkout HEAD filename git checkout commit_Id -- readme.txt
当你从远程库克隆时候,实际上Git自动把本地的master分支和远程的master分支对应起来了,而且远程库的默认名称是origin。
git clone <版本库的网址> <本地目录名>
若是本地库须要和远程库进行关联,则:
git remote add [shortname] [url]
git pull = git fetch + git merge git pull --rebase = git fetch + git rebase //推荐
想要更好的提交树,使用rebase操做会更好一点,这样能够线性的看到每一次提交,而且没有增长提交节点。
在rebase的过程当中,也许会出现冲突(conflict)。 在这种状况,Git会中止rebase并会让你去解决冲突;在解决完冲突后,用"git add"命令去更新这些内容, 而后,你无需执行 git-commit,只要执行:
git rebase --continue // 继续 git rebase --abort // 取消 git rebase –skip // 忽略冲突
而merge 操做遇到冲突的时候,当前merge不能继续进行下去。手动修改冲突内容后,add 修改,commit 就能够了。
git pull时能够加上--rebase参数, 使之不产生Merge点, 保证了代码的整洁, 即: git pull --rebase
但每次都加--rebase彷佛有些麻烦,咱们能够指定某个分支在执行git pull时默认采用rebase方式:
git config branch.dev.rebase true
若是你以为全部的分支都应该用rebase,那就设置:
git config --global branch.autosetuprebase always
这样对于新建的分支都会设定上面的rebase=true了,已经建立好的分支仍是须要手动配置的。
若是当前开发内容并不想提交,可是又有另外紧急开发任务,可使用此命令。
git stash //把当前工做的改变隐藏起来 git stash list //查看已存在更改的列表 git stash pop //可从堆栈中删除更改并将其放置在当前工做目录中
git push origin master // git远程版本回退 git push origin HEAD --force
查看分支:git branch 建立分支:git branch name 切换分支:git checkout name 建立+切换分支:git checkout –b name 合并某分支到当前分支:git merge name 删除分支:git branch –d name 删除远程分支:git push origin --delete [branch-name] //git push origin :br
git checkout master //切换到master git merge <branch name> //合并分支
--no-ff指的是强行关闭fast-forward方式。
fast-forward方式就是当条件容许的时候,git直接把HEAD指针指向合并分支的头,完成合并。属于“快进方式”,不过这种状况若是删除分支,则会丢失分支信息。由于在这个过程当中没有建立commit
git merge --squash 是用来把一些没必要要commit进行压缩,好比说,你的feature在开发的时候写的commit很乱,那么咱们合并的时候不但愿把这些历史commit带过来,因而使用--squash进行合并,此时文件已经同合并后同样了,但不移动HEAD,不提交。须要进行一次额外的commit来“总结”一下,而后完成最终的合并。
总结:
--no-ff:不使用fast-forward方式合并,保留分支的commit历史
--squash:使用squash方式合并,把屡次分支commit历史压缩为一次
在cherry-pick,您能够从其余分支复制指定的提交,而后导入到如今的分支。
git cherry-pick <commit id>
master主分支应该很是稳定,用来发布新版本,通常状况下不容许在上面工做,工做通常状况下在新建的dev分支上工做,工做完后,好比上要发布,或者说dev分支代码稳定后能够合并到主分支master上来。
阮一峰:Git分支管理策略