git初始化 安装完git 需设置账号和邮箱,用于标示用户身份,类似于svn的账号,但是git不存在服务器,所以无需密码验证身份 保存位置C:\Users\yourname\.gitconfig
$ git config --global user.name "Your Name" $ git config --global user.email "email@example.com"
初始化和提交 $ git init $ git add 文件名或* $ git rm 文件名 $ git commit -m "注释" $ git commit --amend --no-edit $ git status
查看日志 $ git log --pretty=oneline $ git log --graph --pretty=oneline --abbrev-commit $ git log -p master ..origin/master
相对引用 HEAD^ 上1级 HEAD^^ 上2级 HEAD^2 当HEAD有2个父节点的时候,HEAD^回到第一个父节点,也就是HEAD正上方的节点,HEAD^2回到第2个父节点 HEAD~4 上面4级,不带数字默认回到上1级 可链式操作:
撤销操作 1.reset $ git reset --hard HEAD^(上一个版本号,或直接版本号)
hard:工作区=暂存区=HEAD=设置版本 mixed:工作区!=暂存区=HEAD=设置版本 soft:工作区=暂存区!=HEAD=设置版本
$ git reset HEAD^(版本号) readme.txt(文件名)
已add到暂存区,还未commit,可从当前版本覆盖到暂存区,即撤销暂存区的修改,之后再checkout就可以撤销工作区内容了 相当于不加参数,默认是mixed。
2.revert
和reset类似都是撤销,区别是reset撤销相当于版本回退,将HEAD指向reset的指定版本。revert撤销是生成一个新commit,该commit消除掉revert指定版本的所有更改,并生成一个新的版本,也就是说生成的版本会和指定版本的上一个版本完全一致。
checkout的用法 1.从暂存区恢复到工作区 $ git checkout -- readme.txt(文件名)
工作区修改还未add到暂存区,可以从暂存区覆盖到工作区,即撤销修改 加上占位符—代表后面跟的是文件路径,不加表示的是分支名
2.切换分支 $ git checkout -b dev(分支名) $ git branch dev $ git checkout dev $ git checkout -b dev origin/dev
3.修改HEAD的指向,并与分支分离
使Head指向指定的版本,并且整个工作区被该版本覆盖,此时分支处于未命名状态,可以用当前状态创建一个新分支,或者切回到另一个已存在分支。
分支操作 $ git branch $ git branch dev $ git branch -d dev(分支名) $ git branch -f 分支名 (版本号或者相对引用) $ git branch -u origin/master 分支名(缺省为当前分支)
合并分支 1.merge $ git merge dev $ git merge --squash dev $ git merge --no-ff -m "注释" dev
2.rebase $ git rebase master $ git rebase -i master $ git rebase -i master dev
3.cherry-pick $ git cherry-pick (版本1) (版本2)
思考 主分支master有C1,C2 2个提交,开发分支dev在主分支基础上有C1,C2,C3,C4,C5 5个提交,除了C5是最后结果,前面的提交都是开发中的过程产生的冗余提交,不需要合并到主分支。 假设目前在dev分支
$ git checkout master $ git cherry-pick C5
$ git rebase -i master $ git checkout master $ git merge dev
采用方法二,最后master和dev都指向的是同一个版本,而采用方法一,2个分支指向的节点不一样,虽然都是C5
标签操作tag
给版本打上标签,以后可以直接通过标签引用,不用再找版本的hash值。如果不指定版本号,默认打在HEAD的指向上。
查找最近的标签
它输出的结果是这样的:<tag>_<numCommits>_g<hash> tag 表示的是离 ref 最近的标签, numCommits 是表示这个 ref 与 tag 相差有多少个提交记录, hash 表示的是你所给定的 ref 所表示的提交记录哈希值的前几位。当 ref 提交记录上有某个标签时,则只输出标签名称。
远程操作 remote $ git remote add origin git@github.com:Mcdull0921/HelloGit.git #为本地项目添加一个远程地址 $ git remote origin set-url [url] #修改远端地址 $ git remote rm origin #删除远端地址 $ git remote add origin [url] #添加远端地址 $git remote -v #查远程地址
fetch git fetch <remote> <place>$ git fetch #相当于是从远程获取所有分支最新到本地,不会自动merge,更新本地全部远程分支指针 $ git fetch origin master #将远程仓库的master分支下载到本地,并更新本地远程分支指针origin/master,只更新一个分支 $ git merge origin/master #进行合并
也可以用以下指令:$ git fetch origin master:tmp #从远程仓库master分支获取最新,在本地建立tmp分支 $ git diff tmp #將當前分支和tmp進行對比 $ git merge tmp #合并tmp分支到当前分支
fetch和pull的来源正好相反:$ git fetch origin foo~1:bar #将远程上的foo上一个版本更新到本地,并且让本地分支bar指向这个版本。 $ git fetch origin :bar #没有指定远程的源,相当于直接在本地创建一个bar分支
这个并不会更新关联的origin/foo的指向,如果bar分支不存在,则会创建一个bar分支
push git push <remote> <place>
如果不跟任何参数,把当前分支的指向推送到该分支关联的远程分支,如果没有关联,提示错误
指定参数,例如$ git push origin master
,把本地的master分支推送到远程仓库origin的master分支,分支名需要一样,用这种方式相当于并不是以当前分支而推送,可指定任意的分支,前提是名字一样
如果分支名字不同,可用$ git push origin foo^:master
,将任意的版本推送到远程仓库master分支
如果远程分支不存在,还可以创建新的分支$ git push origin master:newBranch
$ git push origin HEAD --force #先让本地回到某个版本,此命令向远程推送以当前HEAD作为最新版本,会清除掉服务器上HEAD之后的其他版本 $ git push origin :branch #没有指定本地源直接写:会删除掉远程分支
pull pull就是fetch和merge 2条命令的组合 例如:git pull origin foo
相当于:git fetch origin foo; git merge o/foo
git pull origin bar~1:bugFix
相当于:git fetch origin bar~1:bugFix; git merge bugFix
$ git pull origin master #相当于从远程获取最新版本并merge到本地,相当于git fetch加上git merge $ git pull --rebase #相当于git fetch加上git rebase
文本对比diff
对比文件内容,常用显示命令:
q ,Q:退出显示
H,h:命令帮助(有了这个,其他的都不用看了)
y,k:上一行
e,j,回车:下一行
z,b:上一页
f,space:下一页
小键盘的Home,End,PgUp,PgDn,上,下键对应相应的功能。
$ git diff <commit1> <commit2> 文件目录D
如果git diff后面只有两个commit号,那么git讲输出这两次提交的全部代码差异。如果跟上路径,那么将输出文件目录文件D下所有这两次提交涉及的代码异同。