Git
文章目录
reference pro git
抛开各种命令,让我们从我常见的几种使用情况来看看git的使用情况
并且包含了自己的一些错误经验总结
多人功能开发一个仓库
首先由创建者给其他参与者权限,那么其他参与者直接可以把这个仓库当成自己仓库一样,git clone然后不需要过多的操作,git push一切都已经安排好,注意不要直接在网页上下压缩包,那样解压后没有.git文件,没什么用
如果我在本地修改了,目前来看想要提交到远程,首先应该git pull,然后在本地合并,然后再提交到远程,当然git肯定会保存合并前和合并后的地址ip,可以进行返回操作,但是我的问题是,git如何做到文件的差异性的合并,是认为的每个有差异的文件进行选择吗?但是这样的话项目工程很多不知名文件的修改是软件自己生成的,不关我们的事,究竟是如何处理的,问
Questions/Bug
-
如果是新建分支第一次push,会提示:
英文: fatal: The current branch develop has no upstream branch. To push the current branch and set the remote as upstream, use git push --set-upstream origin master 中文: fatal: 当前分支 master 没有对应的上游分支。为推送当前分支并建立与远程上游的跟踪,使用 git push --set-upstream origin master
然后输入
git push --set-upstream origin master
这行命令,再然后输入用户名和密码,就push
成功了。以后的push
就只需要输入git push origin
Core
-
git reset Reference
-
命令格式:git reset [–soft | --mixed | --hard] space []
1)使用参数--hard,如git reset --hard <commit> 会执行上图中的全部动作①、②、③,即: ①替换引用的指向。引用指向新的提交ID。 ②替换暂存区。替换后,暂存区的内容和引用指向的目录树一致。 ③替换工作区。替换后,工作区的内容变得和暂存区一致,也和HEAD所指向的目录树内容相同。 2)使用参数--soft,如 git reset --soft <commit> 会执行上图中的操作①。即只更改引用的指向,不改变暂存区和工作区。 3)使用参数--mixed或者不使用参数(默认为--mixed),如 git reset <commit> 会执行上图中的操作①和②。即更改引用的指向及重置暂存区,但是不改变工作区。
-
初始化
-
- 将远程仓库克隆成本地仓库 并跟踪
git clone https://github.com/user.name/repository.name.git // 会创建一个 repository.name 的文件夹
- 在本地文件夹下创建仓库
git init // 此时还没有分支 当创建第一个文件时候,会产生一个 master 分支
-
设置用户名和邮箱
git config --global user.name "your name" git config --global user.email "email@example.com"
-
设置账户和密码 可以默认登录 否则每次连接需要输入
cd .git sudo subl config 改 https://github.com/hz2217/Downloads.git 为 https://username:userpasswd@github.com/hz2217/Downloads.git
本地仓库 远程仓库
工作区 暂存区 本地仓库
-
文件的生命周期
- **未跟踪状态:**文件的改变,仓库 git status 检测不到,当 git add 时,相当于一次初始化添加,并提交到暂存区,文件状态变为已跟踪,之后文件的任何更改都可检测到,包括删除和重新创建同名文件
- **已跟踪状态:**通过 git add 将文件的任何改变提交到暂存区
-
工作区 暂存区(stage) 本地仓库(head -> master)
-
暂存区提交到本地仓库
git commit -m "Information" / git commit (自动跳转编写文档)
本地仓库 and 远程仓库
-
本地仓库 -> 远程仓库 (前提 远程的最新快照指针存在于本地指针历史中,否则需要先获取合并再推送,因为可能有别人给此分支推送东西,git 的设置就是需要先获取最新的更新再更改)
// 如果不存在 远程分支名,则新建之 git push <远程库名> <远程分支名> git push <远程库名> <本地分支名>:<远程分支名> // 扩展,删除某个远程分支 git push <远程库名> :<远程分支名>
-
远程仓库 -> 本地仓库 (抓取远程仓库某分支内容到本地仓库,然后和某个本地分支合并)
// pull = fetch + merge
git pull --rebase <远程库名> <远程分支名>
=
git fetch <远程库名> <远程分支名> + git merge <远程库名>/<远程分支名>
跟踪
-
所谓跟踪其实很好理解,如果说本地仓库分支与远程仓库的分支,可以杂交内容
push and pull
(只要有相同的base
),而跟踪是建立一种默认的push and pull
关系,这种关系一般是有分支同名的条件的,(异名还没搞出来) -
// 查看分支跟踪情况 git branch -vva
1. 远程仓库与本地仓库的 库库跟踪
-
// 查看库库跟踪情况 git ls-remote git remote show <远程仓库名>
-
在 git clone 时,是如何建立的跟踪:所有本地分支默认与远程库的同名分支建立追踪关系 ,也就是说,z只有本地的 master 分支自动设置跟踪 origin/master 分支
git clone url // 默认远程仓库名为 origin
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Z41kcRr-1571448058887)(C:\Wjh\大二下\MD\Git\git_clone.PNG)]
-
**当 git init 时,如何跟踪某个远程仓库:**这里有很多奇妙的地方,当使用 git remote add + git fetch 会克隆远程仓库的所有东西及各个分支的内容,1. 但是本地只有一个 master 分支,其他分支都是隐形的 2. 当你在本地创建一个与当前克隆的远程仓库某个分支同名的分支的时候,会自动跟踪远程的那个分支,并且文件与本地克隆的远程仓库分支的内容同步 3. 不过虽说会奇妙的同名分支自动克隆
master -> origin/master
git remote add <远程库名> url + git fetch <远程库名> // 此时 master -> 远程仓库名/master 此方式是内部后来补充实现 ~= git clone url // 只不过 git clone 是外部打包实现
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7e9ahfAY-1571448058888)(C:\Wjh\大二下\MD\Git\git_init.PNG)]
2. 分支的跟踪关系汇总
-
分支跟踪设定后,显示的区别有 Two
git status
,如果有上游跟踪分支会显示,是否与上游保持同步,不然不设定跟踪是否同步才不管你呢,因为不设定即认为你乱来git branch -vva
,会显示跟踪的上游分支,并且会显示本地与远程之间 的差距情况ahead or behind
,因为设定跟踪所以给出对比
-
设定本地跟踪分支(目前只搞定了同名的跟踪)
-
新建本地分支时
git checkout -b 本地分支名 <远程库名>/<远程分支名>
-
已经建立的本地分支更换上游分支
git branch -u/--set-upstream-to [branch] remote/branch // branch -> remote/branch // 虽说可以自定义本地分支名跟踪,但是最好和远程同名,不然没用
-
一些实用指令
Notices
- Github 上不能新建空文件夹