git和github

svn增量式版本控制;git分布式,使用linux命令

Git 的文件管理机制
Git 把数据看作是小型文件系统的一组快照。每次提交更新时 Git 都会对当前的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以 Git 的工作方式可以称之为快照流

基本操作
git init   //在当前目录生成.git目录
或者指定目录作为Git仓库 git init newrepo

状态查看
git status 查看工作区、暂存区状态
-s 以精简的方式显示文件状态。

添加
git add [filename] 将工作区的“新建/修改”添加到暂存区

提交 (存档)
git commit -m “commit message” [filename] 将暂存区的内容提交到本地库

查看commit日志(当前时间线能看到的)
git log // 空格翻页 q退出;git log --oneline

取消对某个文件的跟踪
git rm --cached somefile
如果是目录在rm 后面加上 -r 这个命令并不会删除这个文件。

比较文件差异

git diff [文件名] 将工作区中的文件和暂存区进行比较
git diff [本地库中历史版本] [文件名] 将工作区中的文件和本地库历史记录比较
不带文件名比较多个文件

git以行为单位进行管理,修改了apple.txt,
git diff apple.txt:表示和暂存区比较
git add apple.txt 后,git diff apple.txt,无区别
git diff HEAD apple.txt 和本地库某一个版本比较

冲突的解决

第一步:编辑文件,删除特殊符号
第二步:把文件修改到满意的程度,保存退出
第三步:git add [文件名]
第四步:git commit -m “日志信息” (此时 commit 一定不能带具体文件)

版本切换

git reflog 显示commit的各种版本:
(Head指针在本地库,也就是commit之后显示)

fd83eb9 HEAD@{HEAD@{移动到当前版本需要多少步}:commit:insert ppp edit(若干行此类信息)

基于索引值操作:移动head指针,实现版本切换
git reset --hard fd83eb9(类似各个朝代穿越,各个时期里的内容不一样)

commit之后,如果想撤销最近一次提交(即退回到上一次版本)并本地保留代码:git reset HEAD^

撤销操作 – 丢弃修改unstage

假设工作区的文件add且commit过一次

1.在工作区修改了文件, 修改的状态还没有add到暂存区
git restore – readme.txt:把readme.txt文件在工作区的修改全部撤销 git checkout-- readme.txt

2.修改了文件, 又add到了暂存区, 但是还没有commit
git reset HEAD 把暂存区的修改撤销掉(unstage),就回到了场景1,第二步按场景1操作。
原来的git reset HEAD 可以使用 git restore --staged 代替

3.已经提交了不合适的修改到版本库时,想要撤销本次提交,版本回退

撤销修改
$ git checkout -- readme.txt
令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令。
删除文件并找回

在Git中,删除也是一个修改操作
rm test.txt后,git status,工作区和版本库就不一致了
一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit:
二是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:git checkout – test.txt
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

前提:删除前,文件存在时的状态提交到了本地库(commit之后,rm 了文件)
由于commit操作,本地库记录了你所删除文件的信息【commit提交到本地库之后,就是一个版本了】
操作:git reset --hard[指针位置]
删除操作已经提交到本地库:指针位置指向历史记录 (版本切换)
删除操作尚未提交到本地库:指针位置使用 HEAD(rm文件后,git add添加到暂存区后,找回)
(git reset --hard HEAD 同时刷新暂存区和工作区,回到head指针指向的版本)

分支操作

创建分支 git branch [分支名]
切换分支 git checkout [分支名]
注:切换分支时,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。
创建并切换分支 git checkout -b mybranch
更新master上的东西到该分支上:git rebase master(先切换到该分支)

查看分支 git branch
-v 查看各个分支最后一次提交
-a 显示所有本地及远端分支名
-r 显示所有远程分支
-vv 显示每个(本地)分支当前指向的提交记录的哈希值,以及和其上游分支的相对位置和对应更新(如果有的话)
查看当前属于哪个分支 git checkout

合并分支
第一步:切换到接受修改的分支上 :git check out[被合并分支名]
第二步:执行 merge 命令:git merge [有新内容分支名]
出现冲突,命令行自动进入merge状态

删除本地分支:
git branch -d mybranch(删除未合并分支会报错:使用-D)
删除远程分支
git branch -r -d origin/branch-name
git push origin :branch-name

分支重命名
1.本地分支修改名称
如果对于分支不是当前分支:git branch -m 原分支名 新分支名
如果是当前,那么可以使用加上新名字:git branch -m 原分支名称
2.远程分支重命名
如果修改远程分支,只需要将本地分支重命名为新分支名称,然后删除远程分支,再把本地分支上传就可以了

bug分支

情景:undong.txt 工作还没做完(暂存区有很多add文件,这时还没有commit),这时接收到一个必须在两小时内完成的bug文件(和之前的工作无关)
1 这时就要保存工作现场 git stash
2 添加新分支 git branch fixbug
3 切换到这个分支 git checkout fixbug
4 git add bug文件
5 提交 git commit
6 删除该分支(一般情况应该合并)
查看分支现场 git
7 修复之前的分支 git stash pop

分支关联

在本地创建和远程分支对应的分支(需先fetch origin更新,本地和远程分支的名称最好一致)
git checkout -b dev(本地分支名) origin/dev(远程分支名)

创建本地分支和远程分支的关联
git branch --set-upstream-to origin/。

git checkout --track origin/branch_name
【如果远程新建了一个分支,本地没有该分支】
这时本地会新建一个分支名叫 branch_name ,会自动跟踪远程的同名分支 branch_name。

git push --set-upstream origin branch_name
【如果本地新建了分支 branch_name,但是在远程没有,这时候 push 和 pull 指令就无法确定该跟踪谁,一般来说我们都会使其跟踪远程同名分支 】
这样就可以自动在远程创建一个 branch_name 分支,然后本地分支会 track 该分支,后面再对该分支使用 push 和 pull 就自动同步。

必须使用git init命令创建仓库,执行git add . 和git commit(提交成功后),再使用git branch命令,才显示出本地分支。“因为git的分支必须指向一个commit,没有任何commit就没有任何分支(clone时就不需要这样)

远程与本地库的交互操作
远程库

git remote -v :查看当前所有远程地址别名
git remote add [别名][远程地址]:创建远程库地址别名

克隆

git origin [远程地址]
效果
完整的把远程库下载到本地
创建 origin 远程地址别名
初始化本地库
当我们从远程仓库项目克隆到本地后,会自动创建本地master分支,并且与远程仓库主分支关联。

fetch更新本地仓库 (origin,upstream)

git fetch:将某个远程主机的更新,全部取回本地(不会自动merge),本地库内容不变;默认情况下,取回所有分支的更新。
git fetch <远程主机名> <分支名> :只取回特定分支的更新
取回origin主机的master分支:git fetch origin master
所取回的更新,在本地主机上要用”远程主机名/分支名”的形式读取。比如origin主机的master分支,就可以用origin/master读取。

pull=fetch+merge

//方法一
git fetch origin master 		//从远程的origin仓库的master分支下载代码到本地的origin master
git log -p master.. origin/master	//比较本地的仓库和远程的区别
git merge origin/master		//把远程下载下来的代码合并到本地仓库,远程的和本地的合并

//方法二
git fetch origin master:temp //从远程的origin仓库的master分支下载到本地并新建一个分支temp
git diff temp//比较master分支和temp分支的不同
git merge temp//合并temp分支到master分支
git branch -d temp//删除temp
推送分支

git push [别名] [分支名]

推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样Git就会把该分支推送到远程库对应的远程分支上

git push -u origin master(后面是自己的分支)
如果要推送其他分支,比如dev: git push origin dev
加上了-u参数,Git不但会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令
从现在起,只要本地作了提交,就可以通过命令: git push origin master,把本地master分支的最新修改推送至GitHub

要点
如果不是基于 GitHub 远程库的最新版所做的修改,不能推送,必须先拉取。
拉取下来后如果进入冲突状态,则按照“分支冲突解决”操作解决即可。

假设你配置好了一个远程仓库,并且你想要提取更新的数据,你可以首先执行 git fetch [alias] 告诉 Git 去获取它有你没有的数据,然后你可以执行 git merge [alias]/[branch] 以将服务器上的任何更新(假设有人这时候推送到服务器了)合并到你的当前分支。

注意

brach名字不能ambigous 含糊不清(比如dev),要有意义(比如color-dev),与issue对应

clone到本地后,cd文件夹,默认是在master分支
创建size-dev进行开发,add, commit ,切换回master分支,将size-dev合并到master分支,pull下来更新,(可以进行rebase) git push到自己的github仓库

(1) 没有代码的文件冲突(一般像config或者工程文件冲突):放弃自己的本地修改,即revert(重置)自己的config或者工程文件,再次拉取就没有什么问题了。
(2)有代码的文件冲突:这种情况就要注意了,十分建议在进行下一步操作之前,备份一份自己的代码,最少是自己动过的类,不然很有可能自己的辛苦劳动在“重置”之后不见了。这种情况我的处理方法是:备份后选择将冲突的类全部重置,然后拉取,此时就不会冲突了,再把自己写的代码拷贝到拉取后的相应的类文件里面,再提交推送就可以了。
(3)小技巧避免冲突:一般我们提交代码的顺序是:拉取-提交-推送。这个没有问题,但是有时候会只是提交了,忘了推送,过了一个小时或者一段时间,才想起来,结果推送的时候冲突了,甚至你即便刚刚提交了,马上点击推送,都可能造成冲突:因为有人可能在你操作:拉取之后,提交之前,又推送了,你的版本不是最新的版本了,可能造成冲突。所以建议大家提交代码的顺序是:拉取-提交-拉取-推送。而且,最好是提交了代码,马上拉取,马上推送,尽量避免不冲突。因为冲突给我们带来不必要的麻烦
甚至有这种方法避免操作,屡试不爽:想提交自己的代码了,先不拉取,先提交,提交好了,再拉取,再推送,即:提交-拉取-推送这种方法基本上不会冲突,因为保证了你的代码是最新的版本,这种操作下甚至于两个人同时动一个类文件都不会冲突。总之,建议大家使用这种方法。亲测无误。
(4)提交代码只动自己的类,不要动别人的!如果,在开发过程中,两个人需要动同一个类的话,两个人商量好,谁先谁后,不要出错就好了。

git status

新添加的未跟踪文件前面有 ?? 标记,
新添加到暂存区中的文件前面有 A 标记,
修改过的文件前面有 M标记。
AM:这个文件在我们将它添加到缓存之后又有改动,改动后我们再执行 git add 命令将其添加到缓存中---->A
MA: 表示该文件被修改了并放入了暂存区。

输出标记会有两列,第一列是对staging区域而言,第二列是对working目录而言
github

事务卡片(Issue)
在他人repo上,New一个 issue:提交自己发现的问题

发起请求(Pull Request),点进去, 然后就可以见到你和原作者项目的差异的代码

开源项目贡献流程
新建Issue的方式 : 提交使用问题或者想法
pull request : 步骤:fork项目、修改自己仓库的项目代码、新建pull request、等待作者操作审核。

Git约定式提交(Git Commit 标准化)

用于创建清晰的提交历史。
让你的项目具有规范化,可读性和版本可回溯性

git add.
git commit -m "fix:apk监测记录修复"
git pull//必须先拉取最新的代码,以防产生冲突
git push //提交自己的diam

feat: 新增功能
fix: 修复bug
style: 修改样式,空格,缩进等,不改变代码逻辑
refactor: 代码重构,无新功能或修复bug
pref: 优化相关,比如提升性能,体验
chore: 改变构建流程,增加依赖库,工具
revert: 回滚到上一个版本
test: 测试用例,包括单元测试,集成测试

git命令行登陆github进行操作

登陆github必须先创建SSH key

因为本地Git仓库和GitHub仓库之间的传输是通过SSH加密传输的,GitHub需要识别是否是你推送,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送,所以需要配置ssh key。

  1. 创建SSH Key

在用户主目录(C:\Users\Administrator)下,看看有没有.ssh文件,如果有,再看文件下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接到下一步。如果没有,打开Git Bash,输入命令,创建SSH Key

$ ssh-keygen -t rsa -C "你自己注册GitHub的邮箱" 
  1. 接下来到GitHub上,打开“Account settings”–“SSH Keys”页面,然后点击“Add SSH Key”,填上Title(随意写),在Key文本框里粘贴 id_rsa.pub文件里的全部内容。
 id_rsa.pub 默认在C:\Users\Administrator\.ssh

每台想要登陆某个github账号的主机都需要有一个对应的key,例如你有一个github账号,你在你的笔记本和台式上都要创建key

  1. git bash里输入下面的命令登陆
$ ssh -T git@github.com

如果看到 hi + 你的用户名说明密钥验证通过了,你已经可以上传下载了

  1. 设置username和email,因为github每次commit都会记录他们

git commit 命令会记录提交者的信息,所以使用git前必须先添加两条信息

$ git config --global user.name "你的GitHub登陆名"

$ git config --global user.email "你的GitHub注册邮箱" 

(其实可以不和github上面的用户名邮箱一致,只是为了避免混淆)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值