(参照莫烦教程morvanzhou.github.io/tutorials/others/git/)
1.windos下安装
git为windows提供了.exe的安装包,进入https://git-scm.com/download/win,选择对应的版本,按照默认安装参数安装即可。成功安装后,会在所有程序中出现一个git文件夹,里面有一个Git Bash,之后的命令行操作都可以在这个Git Bash下完成。
2.创建git版本库
init
首先选择要对那个文件夹进行git管理,创建一个文件夹stud,打开Git Bash窗口,cd到stud目录下
使用git config 添加name和email,这样可以更好的记录每一个记录每一个修改的人
使用git init 对该文件进行git管理
提示已经建立了一个空的git管理库
创建一个1.py文件, .git文件夹下存放的为git的一些配置管理文件
status
使用git stauts 可以查看当前版本库的状态
on branch master 提示当前分支在master上,红色的1.py表示1.py的文件还未被加入版本库,提示使用git add <file>添加至版本库
add
使用git add 1.py将1.py文件添加至版本库,还可以使用git add .命令,表示一次性添加所有未被添加的文件
可以看到使用git add 1.py之后再使用git status查看出现了绿色的1.py,表示1.py已添加至版本库
commit
使用git commit -m "creat 1.py"将添加至版本库的1.py文件提交,-m参数表示为此次更改添加的注释
可以看到提示1 file changed
3.修改日志、查看修改内容(log、diff)
log
使用git log 命令可以查看提交的修改记录,可以看到commit的id号有二三十位字母加数字组成,Author为log config 中配置的name和email,date和注释。git log --oneline查看提交修改记录,显示为一行commit id这里只取7位,注释。
编辑1.py加入a = 1,然后git status查看状态,git add . 添加改动至版本库,git commit -m "change 1"提交修改至版本库,使用git log 可以查看到所有提交修改的信息。
diff
修改1.py ,a = 2 b = 1。
没有使用git add .之前,查看1.py与上次commit的1.py的不同使用git diff 查看,红色的-a = 1表示删除了 a = 1,绿色的+a = 2 +b = 1表示添加了a = 2 b = 1
使用 git add .添加1.py至版本库之后,1.py变成了可提交状态,此时使用git diff --cached查看1.py与commit之前的1.py的不同,可以看到此时使用git diff没有任何返回。
再次修改1.py 添加c = b,此时a = 2, b = 1已结通过add添加至版本库,c = b的修改未add,使用git diff HEAD 可以查看这种类型的未commit和commit的不同,下图对比了三种diff的不同
git diff HEAD --filename查看工作区(未add到暂存区)和本地版本库最新修改的文件不同 git diff --filename 查看工作区和版本库的文件不同 git diff --cached --filename 查看暂存区和版本库的文件不同
修改已commit 的版本
复制1.py文件,重命名为2.py,想要吧2.py也写进之前的commit进change2中怎么做呢,可以使用git commit --amend --no-edit (--no-edit不编辑直接合并到上一个commit)
回到过去reset
回到add之前
有时add了修改,又想回到add之前在添加一些修改,可以使用git reset 命令。
编辑1.py,添加d = 1,git add添加至版本库,然后使用git reset 1.py命令可以回到add之前
git status -s直接显示文件的状态,是否添加至版本库,绿色的M表示添加至版本库,红色的M表示未添加至版本库
回到commit之前
每个commit都有一个id号,HEAD是一个指针,指引当前状态是哪个commit,要想回到commit之前,需要让HEAD回到过去,并reset到之前的HEAD。
git reset --hard HEAD会把当前工作目录中未提交的所有内容清空,git reset --hard HEAD^或git reset --hard id号回到上一个commit
可以看到change2消失了
恢复change2,git reflog 查看所有分支的操作记录,使用git reset --hard id号可以恢复change2
回到从前(checkout针对单个文件)
上面做的都是让整个版本库回到commit 之前,只想让某单个文件回到commit之前,可以使用git checkout id号 -- 文件名
git checkout id -- 1.py之后可以看到1.py回到了上次commit的内容,git status看到此时相当于change2中1.py有修改可以提交,使用git commit -m ""back to change ”提交修改,提交之后之前的change2还存在,又产生了一个新的commit记录,但是1.py文件的状态已经回到了c1a24fc时的状态,这就是与reset的区别,reset之后整个版本库会回退至c1a24fc的状态,change2的commit记录会消失
分支
git branch dev 新建名为dev的分支,git branch查看分支, git checkout dev 切换分支,git checkout -b+分支名,可以直接创建和切换分支,git branch -D dev 删除某个分支
在分支中修改文件和在master中修改文件是一样的, -am add所有改变并直接commit
将dev的修改merge推送至master,先使用git checkout master从dev切换分支master,再git merge dev,使用git merge dev 在git log 下不会有commit信息,使用git merge --no-ff -m "keep merge info" dev可以保留merge的commit 信息
merge 分支冲突
可能会有这样的情况,当你在dev分支上进行开发,有人在master上更改了遗留的bug,这个时候当你开发完dev想merge dev到master的时候就会出现冲突了
merge的时候提示出现冲突了
之所以冲突是因为1.py在master和dev上是不同的,打开1.py可以看到git已经把冲突的部分帮我们标记出来了,手动修改下1.py文件
git标记的1.py冲突部分
手动解决冲突之后的1.py
这个时候再进行merge,可以看到这次可以成功merge
rebase分支冲突
rebase也可以进行合并,当有一个共享的分支master和一个当前正在开发的dev分支,当master分支修改了之前遗留的一些bug后,我想试试看修复这些bug之后的版本是否和我的dev分支兼容,这个时候可以使用rebase.(rebase相当于提取了当前的修改,然后将其复制到了目标分支之后,这样可以在dev分支上看到之前发生在master上面的修改log)
在master分支下使用git reset --hard id命令回到之前未merge的状态
可以看到这时,1.py在master和dev中都有不同的修改,因为我们想在dev上rebase master,使用git checkout dev切换至dev分支,这时通过rebase进行合并,可以看到提示文件冲突了,这个时候使用git branch可以看到此时不在HEAD即不在dev也不在master上
vi 1.py 去手动处理掉冲突,然后 git add . 再git rebase --continue可以看到此时rebase成功了,使用git log --oneline可以看到,dev里面加入了master的commit记录,这里和merge不同,merge会创建一个新的commit记录去进行base、目标分支的合并。
使用rebase时只能在自己的分支下面rebase,不可以在共享的分支下进行rebase,这样的话会将master中的commit历史改变
stash
git stash用来暂存当前工作区的内容,让工作区的内容回到和上一次commit的内容一致。这个时候就可以在当前分支下新建一个新的分支内容和当前分支内容一致了
git stash list 用来查看当前stash中的缓存,git stash pop用来提取之前暂存的内容
git下忽略文件
在创建的git仓库文件夹下新建一个.gitignore文件。
# 忽略*.o和*.a文件
*.[oa]
# 忽略*.b和*.B文件,my.b除外
*.[bB]
!my.b
# 忽略dbg文件和dbg目录
dbg
# 只忽略dbg目录,不忽略dbg文件
dbg/
# 只忽略dbg文件,不忽略dbg目录
dbg
!dbg/
# 只忽略当前目录下的dbg文件和目录,子目录的dbg不在忽略范围内
/dbg
github
注册自己的github账号,在git bash中生成一对秘钥,在github setting 中添加ssh key
在github上创建一个仓库,在本地新建一个文件,使用git bash cd进这个文件,然后创建一个README.md文件,使用git config 命令添加name和email,git init 对该文件进行git 管理,使用git commit -am 提交新添加的README.md文件,使用git remote add origin +git仓库url(第一次提交项目需使用这行命令将本地仓库与远程的仓库建立一个链接,origin相当于是仓库url的别名)
git push -u origin master将修改提交到远程仓库(这里的-u参数相当于指定origin为默认的主机)
git push -u origin dev提交dev分支到远程仓库
git branch -D dev 删除本地dev分支,git push -u origin :dev删除远程仓库中的dev分支(:+分支名表示删除分支)
git clone +git仓库url,下载整个项目
git pull -u origin master 将当前master分支的更改更新到本地