关于GIT和github:请搜索git下载安装,安装了git才能去github或码云(国内)观察自己上传的代码,github有个桌面版只是基于git的的图形工具,还是需要下载git。
概念:
1.提交、版本、commit,ID,差不多都一个意思,动词和名词的区别
2.远程服务器:码云,github等网站
3.工作区:指项目的实际文件所在位置。
4.暂存区(缓存区):add命令之后的记录所在位置。
5.储藏区:stash后的记录所在位置。
6.版本(ID):commit命令后生成。
7.指针:借用c语言的指针概念,指向某个版本(ID)
8.分支:一个指针如果叫做nima,那么称nima为分支
9.主分支:大家默认,叫master的指针作主分支
10.HEAD指针:借用c语言概念,HEAD为指向指针的指针,始终指向分支,被HEAD指向的分支为当前分支,也可理解为HEAD就是当前分支
11.跟踪:git将留意项目中被git设为跟踪的文件发生的变化
12..gitignore文件:对于状态为untracked files的文件,加入到该文件后不再提示未跟踪,即设置为不跟踪文件
提示:想看每个命令的全部选项,请在每个命令后打-h 。一般形式为-x或--xxxx
命令:
git init 本地初始化一个仓库
git clone [url] #克隆一个仓库到本地(也可添加主机后再fetch)
git clone -b [branch] [url] #克隆制定分支
git fetch [origin] #拉取远程分支origin/*(不指定分支则拉取所有分支)
git pull [远程主机名] #fetch+merge,细则同上
git add [文件] #纳入git管理
git remote add [主机名] [远程地址] #添加远程服务器,主机名不写则默认为"origin"
git remote show [主机名] #显示远程主机超级详细信息
git remote -v #-v为--verbose(啰唆的)缩写,显示详细信息
git remote rename [主机名] [新主机名] #重命名
git remote rm [主机名] #删除远程服务器
git log --oneline --graph --all # 一行、(树)图形化、全部分支,显示提交记录
git log -n #最近的n个提交记录
git merge [branch] #把branch合并到当前分支,并创建一个最终合并的commit
--abort #中止该次合并
--allow-unrelated-histories #允许不同项目的分支meger(pull也可)到本地
注意:一旦出现合并冲突,将进入“合并冲突状态”,该状态下无法使用任何分支切换命令,直到完成合并或终止合并才退出合并冲突状态。合并冲突状态中,需要修改后再次add冲突文件,并且手动进行一次commit,才能完成合并
git rebase [startPoint] [endPoint] #变基到startPoint,endPoint默认为HEAD可省略
git rebase [startPoint] [endPoint] --onto [branch] #把当前分支线上左开右闭区间内的commit变基到指定分支
-i #启用交互
git push [远程主机名] [本地分支名]:[远程分支名] #推送分支(当前分支存在追踪则只需"git push"即可)
git push -u [远程主机名] [本地分支名]:[远程分支名] #推送分支,同时设为追踪分支
git push [远程主机名] []:[远程分支名] #留空本地分支名,用空分支覆盖远程分支。实际为删除操作
git checkout [file] #从暂存区恢复文件
git checkout [branch] #新建或切换到该分支,工作目录文件回到该分支指向的版本(工作目录变)
git checkout [id] [file]#恢复文件到指定commit的状态
git checkout -b [new local branch] [remote branch] #获取远程分支,将本地新建分支指向获取的远程分支,同时加上远程跟踪
git rm [file] #默认工作区+远程仓库都删除文件
git rm [file] --cached #远程删除,本地不删除
git reset HEAD #重置到当前版本
git reset HEAD~2 #重置到两个版本前(HEAD~ 和 HEAD~1 一样意思)
git reset [$id] #重置到指定ID版本(log显示的那一大串或者log --oneline那小串都可以)
--soft #暂存区不变,工作区不变
--mixed #暂存区清空,工作区不变 默认值
--hard #暂存区清空,工作区回退
注意:无论哪个参数,均能移动当前分支。另外与revert区别在于,reset回去旧版本不被当作一个commit
git revert [$id] # 恢复某次提交的状态,恢复动作本身也创建了一次提交对象
git revert HEAD # 恢复最后一次提交的状态
git commit -m [message] #提交,不带参数-m将启用编辑器以编辑注释
git commit -am [message] #自动把受追踪文件进行暂存+提交
git branch #显示本地所有分支
-a #显示包括远程分支(origin/*)的所有分支
-v #详细显示本地所有分支
-vv #更加详细显示本地所有分支,包括了远程跟踪、落后/领先情况
–d [branch] #删除本地分支,但不能删除当前分支(切去其它分支先),不能删除未合并分支
-D [branch] #强制删除
-u [origin/branch] #设置跟踪的远程分支(-u为--set-upstream-to缩写)
--unset-upstream #取消上面设置的追踪
git difftool [id_1] [id_2] #启用对比工具以对照两次提交,也可以换成文件名对比文件
git stash #把暂存区和未添加到暂存区的被追踪文件储藏起来,清空暂存区和工作区记录(然后就能用checkout切换其他分支了)
git stash list #查看现有的储藏
git stash apply stash@{0} #通过list查看名称(如stash@{0}),不指定储藏则应用最近的储藏
git stash drop stash@{1} #删除指定储藏
git stash push #储藏入栈
git stash pop #储藏出栈
取消跟踪文件的问题
1.被add、commit操作后的文件不属于untracked files,不受.gitignore控制,始终被跟踪,除非他们被git rm命令删除或其他等效的命令
2.常见两种情况:
(1)远程仓库中不需要这个文件,但不想在本地中删除。
删除时加上--cached参数,然后把文件加入.gitignore即可。
(2)远程仓库需要setting.json这个配置文件,但不想暴露其中的个人私密配置信息,想要他只出现在第一次的提交中(没有密码信息),但后续更改不要去追踪变化(有密码信息)。
这个没办法的,将就吧。把setting.json加入到.gitignore,同时复制一份改名为setting.json.example,告知其他人setting.json.example是设置的模板文件,自行更改文件名。关于其讨论,转:git忽略已经被提交的文件
rebase变基操作
基本上必带参数-i,不然容易混乱。
-i参数交互模式,其实就是让你的默认编辑器打开一个临时生成的文件,里面是各种详细信息,通过编辑这个临时文件,就能完成交互,里面大量的#开头的东西,都是注释,主要是让你看下可以怎么改,不用再去百度有什么选项之类的。当你保存并关闭编辑器(vim中wq退出或vscode中关闭编辑窗口等),git进行分析并继续rebase。
当你选择合并若干commit时,git再次启动默认编辑器打开临时文件,让你自由决定如何控制commit提交信息等。
变基冲突时,是逐个commit进行的。如变基3个commit到某个分支,那么冲突等效于这3个commit依次merge到目标分支,也就是可能需要完成3次类似于merge冲突的操作。
类似于merge,你可以在任何时候使用git rebase --abort终止变基恢复原状。
类似于merge,在冲突解决后使用git add [file]暂存该冲突文件。不同在于无需马上提交,而是git rebase --continue以继续