git这个东西不得不说,真的很好用,功能很强大,用过的人都知道。
我不知道有多少人像我一样刚接触的时候两眼瞎,这都是什么鬼东西。
反正我是直接撸官网的那本书撸了两天,挺浪费时间的,不过我觉得我算是入门了,其实也不是很复杂。
基本的使用也就这些命令,我会给出几个场景(可能我并没有实践过<笑哭.png>)。
Begin:
git init 初始化一个文件夹为仓库,会生成一个.git文件夹隐藏
git init --bare 同上也是初始化一个仓库,不过这个仓库是一个裸仓库
git clone <url> [文件夹别名]
Process:
git status 查看当前仓库的状态[未跟踪,已跟踪,已修改,已放入暂存区](建议自行了解一下这个。)
git status -s 精简输出状态
?? 表示未跟踪,
A 已放入暂存区,
M左栏说明已修改但是未暂存,右栏说明已修改已经暂存 ,两栏都有则说明文件已修,暂存后又做了修改
git add <filename>(多功能命令):精确的将内容添加到下一次提交中
1、可以开始跟踪新文件
2、把已跟踪的文件放入暂存区
3、合并时把有冲突的文件标记为已解决状态
git diff :查看未放入暂存区的文件具体改变了那些的内容。(同已经暂存的文件的比较)
git rm <filename> == rm -rf <filename> && git add <delete_filename>
git rm -f <filename> 这两条命令都是删除文件。
git mv old_path new_path 改名或者移动位置
git commit 提交
git commit -m "加上注释提交" 只是提交已经在暂存区中的文件
git commit -a -m "init" 提交并加上注释,跳过暂存区,直接把所有跟踪的文件都提交。
git commit --amend
若是提交过后发现忘记某些内容,可以进行随意修改,
然后将该文件添加到暂存区,再使用该命令可以替换掉之前存的快照。
git log 查看历史的commit信息
git log -p 或者 --patch -2(-p表示显示每次提交所引入的差异,-2表示只显示最近的两条提交。)
git log --all 可以查看所有的分支日志。
git log --oneline --decorate 显示SHA-1校验和、分支、提交信息
git log --oneline --decorate --graph --all
打印提交历史记录,显示分支指针在何处以及历史记录如何分叉。
git branch 查看本地所有分支
git branch -a 查看所有的分支
git branch -r 查看远程所有的分支
git branch -d 删除分支(若删除的分支还有未合并的部分则删除的时候回失败)
git branch -v 查看每一个分支的最后一次提交
git branch --merged 查看有哪些分支已经合并到了当前分支
git branch --no-merged (可以加一个分支名参数,查看某一分支) 查看有哪些分支还没有合并到当前分支
注:建议了解一下分支的概念。
git checkout <branch_name> 切换分支名
git checkout -b <newbranchname> 创建新分支,并同时进行切换
git checkout - 返回到上一个分支
git remote 查看远程仓库
git remote -v 显示远程仓库对应的URL
git remote add <shortname> <url> 添加一个新的远程仓库,并设置一个简短名
git remote show <shortname> 查看某个远程仓库
git remote rename <old_name> <new_name> 修改远程仓库的名字,相应的分支名字也会发生改变
git remote remove <shortname> 删除一个远程仓库,其他的配置也会一并被删除
注:同样建议了解一下,remote是用来做什么的。
git fetch <shortname简称> 可以获得简称对应的仓库中,当前仓库所未拥有的所有信息。
git pull <remotename> <branch>
使用fetch完一般只是获得的对应仓库的对象,
并没有把实际的文件clone到本地所以需要pull一下,
pull操作会自动执行合并操作,然后把实际的文件clone到本地。
关于场景我举个例子:
假如有一个主仓库,很多用户都fork了这个仓库。
然后其中一个多个人发送了一次合并请求,
管理员也同意了这些合并请求,这样其实每个人fork的仓库对于主仓库都不是最新的。
所以在本地操作的时候,需要先fetch一下主仓库,然后pull一下,
这样本地的仓库就是最新的了。
git push <remotename> <branch> 希望将那个分支推到哪个仓库中
关于贮藏,其实这个命令我也没有用过。
场景:
当在一个分支上工作了一段时间,突然要切换到别的分支,但是又不想在当前分支做一次提交。
git stash
保存当前分支的状态,并让当前分支变为干净状态。
当再次切换的时候,会回到原分支工作时的状态。
git stash list 查看贮藏列表
git stash apply 应用最近的一个贮藏
git stash apply +序号 应用所选的贮藏
git stash drop +序号 删除所选贮藏
git stash pop 立即应用贮藏,并从栈中弹出。
以上基本上就是git使用的所有基本命令,其实我也没有使用完,只使用了某一些命令。
Demo1(简单):
1、git clone <url>
克隆远程仓库,如果是一个刚初始化的仓库,只有在一次commit之后才会出现master分支。
2、做一些文件的操作,
如果添加了一个文件,git add
如果修改了一个文件,git add 或者 git commit -a ...
3、commit完之后,直接就使用git push
Demo2(进阶):
1、git clone <url>
2、git checkout -b <newbranchname>
3、在这个分支进行了一些操作之后,要合并到master分支。
4、先回到master分支,git checkout master
5、git merge <要合并的分支>
6、合并完成,删除合并分支。
7、git push
注1:
创建一个新的分支,在新的分支中创建新的文件,要想合并到原分支,操作同上。
合并原理可能不太相同,
具体看:https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%9A%84%E6%96%B0%E5%BB%BA%E4%B8%8E%E5%90%88%E5%B9%B6
注2:
当合并的过程中有同一个文件被两个分支进行了修改,
这时候如果合并这两个分支会出现冲突,
出现冲突文件在merge分支中手动修改冲突文件,然后git add 一下OK。
变基操作:
eg:两个分支,experiment、master
git checkout experiment
git rebase master //将experiment的前一个节点指向master
git checkout master
git merge experiment //进行合并操作、快进合并。
Demo3(完整):
cd /d/ #转到你放代码的地址
mkdir used_car_project #新建文件夹
cd used_car_project/ #转到这个文件夹
git clone http://****/**2/used_car_model.git #把主流程克隆下来
cd used_car_model/ #转到主流程文件夹里
git remote add upstream http://****/**1/used_car_model.git # **2 fork **1
git remote -v
git fetch upstream #上传前先跟upstream merge 一下
git pull upstream master #本地跟upstream一致
git checkout -b <newbranchname> 在这个分支上进行一些操作。
git commit -m "add data prepare script" #加到local repo
git push origin dataprepare #推到remote origin
如果有使用git管理工具,可以在管理页面发起pull request,也可以手动合并到master再进行push。