git使用
1.设置用户名和邮箱
git config --global user.name "r1chie"
git config --global user.email r1chie@ramboai.com
2.初始化git
git init
2.1 配置文本编辑器
git config --global core.editor vim
3.克隆仓库
git clone xxxxx
可以克隆本地目录
克隆后,文件夹里面只有.git目录,而没有文件,原因是该项目存在多个分支,使用来来查看远程分支:
git branch -r(远程) 或 -a(所有)
查看之后再使用:
git checkout branch_path
就可以clone出来了。
4.文件跟踪
增加追踪文件,或者把已经追踪的文件放进暂存区。因此每次将文件修改之后,需要进行git add命令把文件放入暂存区。
git add xxx.c
删除追踪文件
git rm xxx.c
如果git add后面是目录,那么将递归目录下所有的文件
5.查看修改记录
git log
也可以查看简略统计信息
git log --stat
6.查看状态
查看文件处于什么状态
git status
状态简览:
git status -s
A:表示新添加到暂存区中的文件
M:表示修改过的文件
7.对比文件
工作区文件与仓库中的文件对比:
git diff
与缓存区里的文件与仓库中的文件对比:
git diff --cached
8.上传文件
上传文件:
git commit
添加修改的信息:
git commit -m "xxxxxxxx" ///字符串可填版本号
9.查看远程主机名
git remote -v
10.撤销操作(未push)
10.1 文件被修改,但未执行git add操作(从工作区内撤销)
git checkout filename //恢复原来的文件
git checkout . //恢复已经修改过的文件
10.2 同时对多个文件进行git add,但只想commit部分文件
git add *
git status //查看已经被add的文件
git reset HEAD filename //取消某个文件的暂存
10.3 文件执行了git add,但想撤销对其的修改
git reset HEAD filename //取消暂存
git checkout filename //撤销修改
10.4 修改的文件已经被git commit,但想再次修改并且不产生新的commit
git add filename
git commit --amend -m "xxx" //这样就会修改掉最后一次的commit
10.5 已在本地进行了多次commit操作,现在想撤销到其中某次commit
git reset --hard hash
hard:会清空工作区和缓存区的内容,并更新工作区
git reset --soft hash
soft:不清空工作区和缓存区
git reset --mixed hash
mixed:仅仅清空缓存区,不清空工作区
11.回滚(已push)
例子:
程序提交顺序:
B1 11
A2 10
A1 9
A发现A2程序有错误,需要退回到A1,那么A的正确操作是这样的:
git reset --hard A1 //本地退回到A1
git push -f origin dev //强制推送到远程仓库的 dev分支
那么该分支的版本就是A1,B的代码要基于A1,B可以这么操作:
git checkout dev //切换到工作分支
git reflog //查看B1的版本id
git reset --hard B1 //回滚到B1
git checkout -b devb1 //拉取新分支
git log //检查零时日志
git checkout dev //切换到工作分支
git reset --hard A1 //回滚到A1版本
git reset --hard origin/dev //本地仓库回滚到
git merge devb1 //合并临时分支版本
git push origin dev //推送到远程仓库dev分支
12.分支
创建新的分支,使用命令:
git branch_name
切换分支
git checkout branch_neme
或者
新建并且切换分支命令
git checkout -b branch_name
删除分支
git branch -d branch_name
查看各个分支在哪个commit上
git log --decorate
查看更为详细的分支情况
git log --decorate --graph --all
12.1 合并分支
合并分支
git merge branch_name
- 情况一:在这种情况下,把hotfix合并到master,那么只是把指针master移动到hotfix
- 情况二:把iss53合并到master中,那么就会产生一个新的commit—C6,C6有两个父节点,一个是C4,一个是C5
-
冲突合并:如果C4中对文件A的第11行做了修改,并且C5也是对文件A的第11行做了修改,就会产生冲突,那么git会暂停下来,等待你解决了这个合并冲突后,才能进行合并。冲突后,可以打开冲突的文件:
<<<<<<< HEAD:1.txt 123 ======= 321 >>>>>>> iss53:1.txt
====上半部分是HEAD所指向的版本的冲突内容,=====下半部分是iss53分支所指示的版本的冲突内容,你可以保存只某个部分的内容,重新git add将其标记为已解决。
12.2 远程仓库
克隆远程仓库:
git clone path
克隆后,本地仓库将会命名为origin/master。git也会给你一个与origin的master分支指向同一个地方的本地master分支
如果此时,在远程仓库已经被其他开发更新了,你可以使用命令来更新你的本地仓库:
git fetch origin
origin是服务器,从远程仓库中抓取本地没有的数据,并且更新本地数据库,移动origin/master指针指向新的、更新后的位置
遇见的问题
我在本地clone后,做一些修改,再push到本地文件,push能成功,并且能看到log,但在主仓库中却没有看见文件的更新。
原因是当前本地仓库只是一个工作区,在push后,信息是存放在数据库的,因此还需要将数据库中的信息更新到工作区,可以调用:
git checkout master .
文档参考:https://www.progit.cn/#_git_branching