总觉得能写出来才是自己的。我们进行开发工作,代码和版本管理是不可少的,git不同于CVS和SVN这样的集中式版本控制系统,它是分布式的,每个人都有一份代码库,远端的中央服务器只是起到交换代码修改的作用。git的优势不仅在于不联网就能干活,更强大的是它的分支管理。
安装好后需对其进行配置:git config --global user.name "qiqi"; git config --global user.email "qiqi@qq.com"
创建版本库:在新建的文件夹下右键打开gitbash或者按住shift打开cmd,执行:git init。此文件夹变为一个git仓库。
git工作流:
在仓库中有修改时:通过git add -A,提交到暂存区;
提交到历史区:git commit -m“第一次修改” ;(提交前必须add)
查看三个区域的状态:git status,红色表示工作区的改动,绿色表示暂存区的改动。
查看工作区和暂存区中文件的区别:git diff;
查看暂存区和历史区的差异:git diff -cacher
回到过去的commit或者到未来的commit:
查看commit记录:git log;(git log --oneline:精简显示信息;git log --oneline --all --graph --decorate:类图形化显示commit变动)
回退到上一个版本:git reset --hard HEAD^(git reset --hard 提交id:回退到任意之前的版本; --hard:回退工作区、暂存区、历史区;--soft:值回退历史区:--mixed:只回退历史区和暂存区)
回退后悔了,想恢复回退:git relog:查看命令记录,git reset --hard 提交id。
git commit –amend:有时候用 git commit -m 提交时,可能没写好或者误操作导致提交的信息不合适,但你还没有 push 到远程分支时,修改还未提交到远程分支的 commit 信息。
撤销修改:
之前add了未commit,现在未 add未commit,丢弃工作区:git checkout -- 文件名
之前add了commit了,现在未add,丢弃工作区:git reset HEAD 文件名;git checkout -- 文件名;
关于git checkout:
git checkout:汇总显示工作区、暂存区与HEAD的差异。
git checkout HEAD:同上
git checkout -- filename:用暂存区中filename文件来覆盖工作区中的filename文件。相当于取消自上次执行git add filename以来(如果执行过)的本地修改。
git checkout branch -- filename:维持HEAD的指向不变。用branch所指向的提交中filename替换暂存区和工作区中相应的文件。注意会将暂存区和工作区中的filename文件直接覆盖。
删除文件:
误删:git checkout -- 文件名;确实要删除:git rm 文件名;git commit -m“删除”
分支:
git默认是在master上,在此基础上可以建立其他分支,同时有一个指针head,指向最新提交(commit),
查看分支: git branch;
创建并切换分支:git checout -b dev (等于git branch dev,git checkout dev);
在master分支上把dev合并到master上:git merge dev
删除分支:git branch -d dev
放弃某次合并:git merge --about
合并冲突:分别在A分支和B分支上修改,merge时出现冲突,这时候需要手动解决冲突,然后再提交。git log
--graph --oneline可以查看分支合并图。
禁用快速合并模式:通常合并分支是,如果可能,git会用fast forward模式,这样合并后会丢掉分支信息。禁用ff模式:git merge --no--ff -m“merge with no--ff” dev.
在分支B上执行git rebase 分支A:会将B分支的所有提交追加在A分支后,以前的B分支会被丢弃。(如果想放弃rebase:git
rebase --abort)
git cherry-pick commitID:把其他分支的某次提交追加到当前分支。
关联github:
git remote add origin 代码库地址;(origin可以随便是 什么名字,只是个标示而已,如果不想关联了:git remote rm origin)
git remote -v;查看关联了哪些github
git push -u origin master:将master分支的东西提交到github(远端);
git pull origin master:把远端的拉到本地。(或者在起初就直接克隆:git clone 仓库地址)
其他命令:
git内部原理图:
每commit一次就会产生tree对象(暂存区当前目录树的快照)和commit对象,master分支指向最新的提交。
git ls-files:查看暂存区有什么文件;
git ls-tree HEAD 查看历史区有哪些文件
git cat-file -p id:查看对象内容。