github与git相关

348 阅读10分钟

参考:

git是一个运行在电脑上的版本控制软件,而GitHub是基于git这个版本控制软件打造的网站

git的三个概念:提交commit、仓库repository、分支branch

github操作相关

一、注册(sign up)

二、访问仓库

1. 域名+仓库owner+仓库名(.git)

github.com/../..(.git)

2. github搜索

三、使用

1.仓库管理

explore:根据浏览习惯与兴趣创建一个仓库列表,每天更新。

2.创建仓库,添加文件,提交issue,提交/接受pr

2.1创建仓库new repository

  • Add .gitignore 对于只使用GitHub的用户是不用管的
  • license是本仓库的协议文件

2.2添加文件

add files

2.3提交issue

new issue

将issue问题归属到自己名下,由自己来进行解决,通过assignees设置

labels选择issue的标签

2.4提交pr

3.如何去查找开源项目

  • trending

  • 技巧。常用前缀后缀

    • 找百科大全 awesome xxx
    • 找例子 xxx sample
    • 找空项目架子xxx starter/xxx boilerplate
    • 找教程xxx tutorial

git

  • 配置public key

ssh-keygen -t rsa -C“youremail@example.com” 注意,上述youremail@example.com是指GitHub的账户的注册邮箱

  • 下载到本地:git clone ..

  • star收藏

  • git clone与download zip下载的区别:download zip下载解压得到的是【文件夹】;而clone下来的是【仓库】,有一个隐藏的.git文件夹,不希望被删掉;文件夹要通过git初始化后才能变成【仓库】。

  • git init 初始化文件夹,变成一个仓库,进行后续git版本管理

  • git add -A把所有的文件都加入暂存区

  • git commit -m "提交信息"

    已有的代码文件都在工作区里,通过git add <file>进入暂存区,接着通过git commit -m ""提交的方式到仓库

  • vs code代码绿色,表示代码还在你的工作区里,还没有提交到仓库。分支图标表示源码管理器,更改会与之前的进行比较,U代表完全新增的一个文件。git add 之后,分支那里会有一个暂存的更改

  • git提示:please tell me who you are

    • git config --global user.email "your email"
    • git config --global user.name "your name"
  • 直接在分支图标那里,添加到暂存区,就是那个加号。commit直接在更改上面的消息框,输入提交信息,按下command+enter

  • git config --global init.defaultBranch <name>

  • git branch -m <name>

  • git log --stat查看提交记录的历史。如何退出命令行呢?分支也可以看commit。 回滚:

  • git checkout <filename> 工作区打回去。或者直接在分支图标那里直接点击放弃更改的图案。

  • git reset HEAD^ 提交后撤回。定向到HEAD的某一个。HEAD^1表示HEAD的上一个。或者找到那个需要撤回的commit,右键点击undo commit 分支:(命令行或者vs code的图形化操作界面)

  • git checkout -b 分支名 从当前节点新建分支。以当前分支为基础新建分支。(该命令最好是在主分支下执行)

  • git branch 列举所有的分支

  • git checkout <branchname> 单纯的切换到某个分支

  • git branch -D <branchname> 删掉特定的分支(分支完成各自任务合并至master后,就可以删除了)

  • git merge <branchname> 合并分支(在master分支下执行,表示将下的内容全部合并到master下)

当两个分支的内容修改有冲突就会出现如下提示。右键分支图标的合并更改,选择当前已有,还是当前传入。 image.png

  • git merge --abort放弃本次合并2933 git与GitHub远程仓库:

  • git push 推送

  • git pull 拉取 在GitHub远端new repository一个空白的仓库,接着把本地创建好的这个仓库提交上去即可。

  • git remote add origin git@git.xxx:xxx/xxx.git    关联远程仓库

  • git pull origin master   此时已经有远程库在你本地了

没有本地仓库,根据远程仓库创建一个。

`…or create a new repository on the command line`
echo "# copy" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M master
git remote add origin git@github.com:leondong68/copy.git
git push -u origin master

已有本地仓库,将本地仓库推送至远程。

`…or push an existing repository from the command line`
git remote add origin git@github.com:leondong68/copy.git
git branch -M master //改名,重名分支
git push -u origin master

git remote add origin git@github.com:leondong68/copy.git表示我们把copy当作一个远端的仓库,添加到了我们本地的git中,git就能知道他在远端的仓库对应的是我们刚刚在GitHub新建的这个。

后续如果在本地有任何更改,就可以直接git push推送到远端了。在push到GitHub之前,git会做一个比较,你现在提交的这个水平是不是已经领先于GitHub,如果是,就用push。但是如果远程已经有了新的更新了,本地还没有,本地进行了其他的更新,这个时候会让你先pull,再push。pull的过程其实就是和远程这个分支合并的过程,合并也可能产生冲突。

在GitHub上修改,commit changes按钮。现在只是远程修改了,本地没有修改,需要git pull拉取到本地。

在本地做好更改之后,提交更改到远程

先 git add . 表示保存所有更改到暂存区

再 git commit -m "这次是xx的修改" 到仓库

然后 git push [远程仓库名] [本地分支名] : [远程分支名] 将仓库的修改提交到了远程分支

从远程仓库拉取最新代码合并到本地分支

  • 1.git pull:获取最新代码到本地,并自动合并到当前分支(不推荐这种方式,因为是直接合并的,无法提前处理冲突。)
//查询当前远程分支

$ git remote -v

//直接拉取并合并最新代码

$ git pull origin master [示例1:拉取远端origin/master分支合并到本地当前分支]

$ git pull origin dev [示例2:拉取远端origin/dev分支合并到本地当前分支]
  • 2.git fetch + merge: 获取最新代码到本地,然后手动合并分支

    • 额外建立本地分支
//查看当前远程的版本
$ git remote -v
//获取最新代码到本地临时分支(本地当前分支为[branch],获取的远端的分支为[origin/branch])
$ git fetch origin master:master1  [示例1:在本地建立master1分支,并下载远端的origin/master分支到master1分支中]
$ git fetch origin dev:dev1[示例1:在本地建立dev1分支,并下载远端的origin/dev分支到dev1分支中]
//查看版本差异
$ git diff master1 [示例1:查看本地master1分支与当前分支的版本差异]
$ git diff dev1    [示例2:查看本地dev1分支与当前分支的版本差异]
//合并最新分支到本地分支
$ git merge master1    [示例1:合并本地分支master1到当前分支]
$ git merge dev1   [示例2:合并本地分支dev1到当前分支]
//删除本地临时分支
$ git branch -D master1    [示例1:删除本地分支master1]
$ git branch -D dev1 [示例1:删除本地分支dev1]
  • 无须额外建立分支(推荐)
//查询当前远程的版本
$ git remote -v
//获取最新代码到本地(本地当前分支为[branch],获取的远端的分支为[origin/branch])
$ git fetch origin master  [示例1:获取远端的origin/master分支]
$ git fetch origin dev [示例2:获取远端的origin/dev分支]
//查看版本差异
$ git log -p master..origin/master [示例1:查看本地master与远端origin/master的版本差异]
$ git log -p dev..origin/dev   [示例2:查看本地dev与远端origin/dev的版本差异]
//合并最新代码到本地分支
$ git merge origin/master  [示例1:合并远端分支origin/master到当前分支]
$ git merge origin/dev [示例2:合并远端分支origin/dev到当前分支]

git add -A 和 git add . 的区别: git add -A和 git add . git add -u在功能上看似很相近,但还是存在一点差别

git add . :他会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。

git add -u :他仅监控已经被add的文件(即tracked file),他会将被修改的文件提交到暂存区。add -u 不会提交新文件(untracked file)。(git add --update的缩写)

git add -A :是上面两个功能的合集(git add --all的缩写)

git init
echo Change me > change-me
echo Delete me > delete-me
git add change-me delete-me
git commit -m initial
 
echo OK >> change-me
rm delete-me
echo Add me > add-me
 
git status
# Changed but not updated:
#   modified:   change-me
#   deleted:    delete-me
# Untracked files:
#   add-me
 
git add .
git status
 
# Changes to be committed:
#   new file:   add-me
#   modified:   change-me
# Changed but not updated:
#   deleted:    delete-me
 
git reset
 
git add -u
git status
 
# Changes to be committed:
#   modified:   change-me
#   deleted:    delete-me
# Untracked files:
#   add-me
 
git reset
 
git add -A
git status
 
# Changes to be committed:
#   new file:   add-me
#   modified:   change-me
#   deleted:    delete-me

总结:

  • git add -A 提交所有变化

  • git add -u 提交被修改(modified)和被删除(deleted)文件,不包括新文件(new)

  • git add . 提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件

常用git命令

  1. 创建分支
git branch test
  1. 把分支推到远程分支
git push origin test:master         // 提交本地test分支 作为 远程的master分支
git push origin test:test              // 提交本地test分支作为远程的test分支

  1. 查看本地分支
git branch
  1. 切换分支到test git checkout test

  2. 切换到之前提交的log(commit 69ad395df31468bdc062ab7b4c623cf40c6df4ce)上 git checkout 69ad395df

  3. 删除本地分支test git branch -d test

  4. 删除远程分支
    git branch -r -d origin/branch-name

git push origin :branch-name

git remote remove br-name

  1. 获取远程分支信息 git remote show (remote-br)

  2. 将当前master中的内容提交到另外一个远程分支 git remote add branch1 xxx.git

git fetch branch1

git merge branch1/master

git push branch1 master

从一个远程仓库拉取更新同步到另外一个远程仓库。一个典型应用场景是,我fork了一个RTT到我的git下,然后从我的远程仓库中git clone到了本地。一段时间之后,RTT官方的git上有了更新,如何把RTT官方git上的更新同步到我的远程git上?就利用上面的命令,首先在本地git命令中用git remote add增加一个分支来跟踪RTT官方的git,然后把RTT官方的更新git fetch下来,再然后用git merge合并到本地的master分支上,最后用git push提交到自己的远程git上。

  1. 把分支"branchname"合并到了当前分支里面

git merge branchname

如果有冲突,在有问题的文件上会有冲突标记,在你手动解决完冲突后就可以把此文件添 加到索引(index)中去,用git commit命令来提交,就像平时修改了一个文件 一样。

将其它分支多个commit合并到当前分支的一个commit

git merge --squash another

git commit -m "message here"

--squash 选项的含义是:本地文件内容与不使用该选项的合并结果相同,但是不提交、不移动HEAD,因此需要一条额外的commit命令。其效果相当于将another分支上的多个commit合并成一个,放在当前分支上,原来的commit历史则没有拿过来。

  1. 打标签

git tag -a v1.4

共享标签到服务器

git push origin --tags

  1. 放弃当前目录的所有修改

git checkout .

  1. git查看某个文件的修改历史
  • 先切换到文件所在目录,如

cd packages/apps/Mms/src/com/android/mms/ui/

  • 然后使用以下命令之一

Git log -p filename

查看文件的每一个详细的历史修改,如果没有-p选项,只显示提交记录,不显示文件内容修改,git log -p -3

filename 显示最近的3次提交。

git log --pretty=oneline filename

每一行显示一个提交,先显示哈希码,再显示提交说明。

git blame filename

查看文件的每一行是哪个提交最后修改的。

本地分支merge到远程分支

背景:为了更加规范维护自动化测试工程,代码提交流程最近更新了,先拉分支到本地修改,完成后同步到远程分支。

前置条件

(1)本地机器可通过ssh与gitlab服务器通信

(2)gitlab上的测试项目中有两个分支master、auto_test

步骤一、创建本地分支

执行命令:git checkout -b local_auto_test auto_test    //基于远程的auto_test分支创建本地分支

或者使用IntelliJ IDEA创建本地分支:

步骤二、提交本地分支

on branch local_auto_test(在本地分支)

(1)执行命令:git add .

(2)执行命令:git commit -m '注释'

或者使用IntelliJ IDEA提交本地分支:

 

步骤三、Merge到远程仓库

(1)执行命令:git checkout auto_test   //切换分支到auto_test
(2)执行命令:git merge local_auto_test    //merge之前local_auto_test内容到本地auto_test分支
(3)执行命令:git push origin auto_test    //将本地auto_test分支推送到远程服务器。

从远程仓库中抓取或拉取

1、抓取: git fetch (更新到本地仓库,不会自动merge到工作路径)

image.png

2、拉取 :git pull(更新到本地仓库,并且会自动merge到工作路径)

image.png