看了这篇文章,你应该可以应付工作中90%的git命令 | 字数总计: 2.8k | 阅读时长: 9分钟 | 阅读量: |
开始 git初始化 安装完git 需设置账号和邮箱,用于标示用户身份,类似于svn的账号,但是git不存在服务器,所以无需密码验证身份。 保存位置C:\Users\yourname\\.gitconfig
。
1 2 $ git config --global user.name "Your Name" $ git config --global user.email "email@example.com"
仓库初始化和提交 1 2 3 4 5 6 $ git init $ git add 文件名或* $ git rm 文件名 $ git commit -m "注释" $ git commit --amend --no-edit $ git status
查看记录 1 2 3 4 5 $ git log --pretty=oneline $ git log --graph --pretty=oneline --abbrev-commit $ git log -p master ..origin/master $ git log filename $ git show c5e69 filename
相对引用 HEAD^
上1级;HEAD^^
上2级;HEAD^2
当HEAD有2个父节点的时候,HEAD^
回到第一个父节点,也就是HEAD正上方的节点,HEAD^2
回到第2个父节点;HEAD~4
上面4级,不带数字默认回到上1级; 可链式操作:
1 $ git checkout HEAD~^2~2
撤销操作 1.reset 1 $ git reset --hard HEAD^(上一个版本号,或直接版本号)
hard:工作区=暂存区=HEAD=设置版本 mixed:工作区!=暂存区=HEAD=设置版本 soft:工作区=暂存区!=HEAD=设置版本
1 $ git reset HEAD^(版本号) readme.txt(文件名)
已add到暂存区,还未commit,可从当前版本覆盖到暂存区,即撤销暂存区的修改,之后再checkout就可以撤销工作区内容了 相当于不加参数,默认是mixed。
2.revert
和reset类似都是撤销,区别是reset撤销相当于版本回退,将HEAD指向reset的指定版本。revert撤销是生成一个新commit,该commit消除掉revert指定版本的所有更改,并生成一个新的版本,也就是说生成的版本会和指定版本的上一个版本完全一致。
checkout的用法 1.从暂存区恢复到工作区 1 $ git checkout -- readme.txt(文件名)
工作区修改还未add到暂存区,可以从暂存区覆盖到工作区,即撤销修改 加上占位符—代表后面跟的是文件路径,不加表示的是分支名
2.切换分支 1 2 3 4 $ git checkout -b dev(分支名) $ git branch dev $ git checkout dev $ git checkout -b dev origin/dev
3.修改HEAD的指向 使Head指向指定的版本,并与当前分支分离,而且整个工作区被该版本覆盖,此时分支处于未命名状态,可以用当前状态创建一个新分支,或者切回到另一个已存在分支。
使Head指向指定的版本,并且整个工作区被该版本覆盖,此时分支处于未命名状态,可以用当前状态创建一个新分支,或者切回到另一个已存在分支。
4.批量解决冲突 如果合并版本后产生了冲突文件,可以手动修改后再git add
,也可以批量解决冲突,选择自己的版本或选择别人的版本
1 2 $ git checkout --ours . $ git checkout --theirs .
分支 1 2 3 4 5 6 $ git branch $ git branch dev $ git branch -d dev(分支名) $ git branch -f 分支名 (版本号或者相对引用) $ git branch -u origin/master 分支名(缺省为当前分支) $ git branch -m rename_old rename_new
合并 1.merge 1 2 3 $ git merge dev $ git merge --squash dev $ git merge --no-ff -m "注释" dev
如果git merge
合并的时候出现refusing to merge unrelated histories的错误,原因是两个仓库不同而导致的,需要在后面加上--allow-unrelated-histories
进行允许合并。
2.rebase 1 2 3 $ git rebase master $ git rebase -i master $ git rebase -i master dev
3.cherry-pick 1 $ git cherry-pick (版本1) (版本2)
思考 主分支master有C1
,C2
2个提交,开发分支dev在主分支基础上有C1
,C2
,C3
,C4
,C5
5个提交,除了C5
是最后结果,前面的提交都是开发中的过程产生的冗余提交,不需要合并到主分支。假设目前在dev分支
1 2 $ git checkout master $ git cherry-pick C5
1 2 3 $ 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 提交记录上有某个标签时,则只输出标签名称。
远程 将本地分支和远程分支关联。如果某人已在远程服务器上添加了分支dev,你想把这个分支down下来,首先你要本地创建一个分支,然后将本地分支与远程地址关联
1 $ git branch -u origin/dev dev
也可直接创建并关联
1 $ git checkout -b dev origin/dev
remote 1 2 3 4 5 $ 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>
1 2 3 $ git fetch $ git fetch origin master $ git merge origin/master
也可以用以下指令:1 2 3 $ git fetch origin master:tmp $ git diff tmp $ git merge tmp
fetch和pull的来源正好相反:1 2 $ git fetch origin foo~1:bar $ git fetch origin :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
;1 2 3 4 $ git push -u origin master $ git push origin HEAD --force $ git push origin :branch $ git push origin master:my_remote_new_branch
pull pull就是fetch
和merge
2条命令的组合,例如:git pull origin foo
相当于:git fetch origin foo; git merge origin/foo
git pull origin bar~1:bugFix
相当于:git fetch origin bar~1:bugFix; git merge bugFix
1 2 $ git pull origin master $ git pull --rebase
文本对比diff 对比文件内容,常用显示命令:
q ,Q:退出显示
H,h:命令帮助(有了这个,其他的都不用看了)
y,k:上一行
e,j,回车:下一行
z,b:上一页
f,space:下一页
小键盘的Home,End,PgUp,PgDn,上,下键对应相应的功能。
1 $ git diff <commit1> <commit2> 文件目录D
如果git diff
后面只有两个commit号,那么git将输出这两次提交的全部代码差异。如果跟上路径,那么将输出文件目录文件D下所有这两次提交涉及的代码异同。