gitk 图形界面查看修改的东西
拉取
git pull --rebase
拉取不产生冲突,会直接 rebase,不会产生分支合并操作,如果有冲突则需要手动 fix 后,自行合并。
1.git reset 版本回退
git reset --hard HEAD^
回退到最近的一个版本
git reset --hard commit_id
回退到指定版本的id
HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。
穿梭前,用git log
可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog
查看命令历史,以便确定要回到未来的哪个版本。
工作区和暂存区
将本地修改的文件添加到git版本库
我们把文件往Git版本库里添加的时候,是分两步执行的:
- 第一步是用
git add
把文件添加进去,实际上就是把文件修改添加到暂存区; - 第二步是用
git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的
(如果修改了文件,git add之后,又修改了之后,直接git commit到版本库,那么只会将第一次的修改提交到版本库,因为第二次没有add。git commit只负责把暂存区的代码添加到版本库中)
撤销修改
工作区文件修改了,但是没有add到暂存区,放弃更改
git checkout -- filename
注意有 – 不然成了切换分支
工作区文件修改了,并且add到暂存区,放弃更改
git reset HEAD filename
删除文件
一般是直接在文件管理器里面删了 先手动删除文件,然后使用git rm <file>
和git add<file>
效果是一样的。
还有一种是误删本地的,要从版本库恢复到本地
git checkout -- filename
创建和合并分支
创建分支
git branch branchName
删除分支
git branch -d branchName
删除一个没有合并过的分支
git branch -D <name>
切换分支
git checkout branchName
切换并创建分支
git checkout -b branchName
罗列所有的分支列表
git branch
当前分支前会有*
合并分支
git merge branchName
切换到B分支,完成开发后,commit一下,再切换到A分支,会发现B分支上的改动A分支上并没有,这时候将B分支合并到A
分支,就会将内容合并到A分支上
merge之后,要提交master上的合并的内容,直接push。不需要再commit了
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
用git log --graph
命令可以看到分支合并图。
分支管理策略
合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
git merge --no-ff -m "merge with no-ff" dev
贮藏
git stash
将当前的工作内容贮藏
git stash save "msg"
带贮藏信息的贮藏
git stash list
查看贮藏的列表
git stash apply
恢复贮藏但不删除这个贮藏 需要使用git stash drop来删除
git stash pop
恢复贮藏并且删掉它
git stash apply stash@{0}
恢复指定的贮藏
多人协作
当从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。并且从远程库clone时,默认情况下,只能看到本地的master分支。
如果远端有一条dev分支
git checkout -b dev origin/dev
创建远程的dev分支到本地 (检出)
git remote
查看远程库的信息
git remote -v
查看更详细的信息
因此,多人协作的工作模式通常是这样:
1、首先,可以试图用git push origin <branch-name>
推送自己的修改;
2、如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
3、如果合并有冲突,则解决冲突,并在本地提交;
4、没有冲突或者解决掉冲突后,再用git push origin <branch-name>
推送就能成功!
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建
用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
。
推送分支
git push origin <branch-name>
推送相应分支上的修改
推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支
推送到远程库对应的远程分支上
git push origin master
推送本地的master分支
git push origin dev
推送本地的dev分支
rebase
rebase操作可以把本地未push的分叉提交历史整理成直线;
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。