1

Github入门与实践

常用命令列表

在操作前,须明晰三个概念:工作空間=》缓存空間=》代码仓库。Git代码仓库存储内容记录了每一次的修改变动。

工作空间:你正在操作和修改的地方

缓存空间:阶段性保存工作空间中修改内容的地方(git add命令后,存储修改的位置)

仓         库:固化存储修改变动内容的地方(git commit命令后,存储修改位置)。某次修改变动内容只要存储进入了仓库之中,这个记录就会一直存在,由唯一的commit id进行标识。

1、为一个本地目录创建git版本仓库:

git init                                               //自动在当前目录生成代码管理本地仓库,放入本路径下的文件都可以进行版本管理。

2、将工作空间内容(修改)添加进入缓存空间:

git add .                                          //添加并跟踪当前目录以及子目录中所有文件的修改

git add -u                                       //仅添加当前目录以及子目录中已被跟踪文件的修改

3、将缓存空间内容提交到本地仓库中固化

git commit -m “提交说明文档”      //注意,-m 后面的说明是不可缺的;修改内容必须先添加进缓存空间后,才可以commit(先git add ,再git commit)

4、将仓库代码回退到指定版本commit id:

git reset –hard <commit id>         //commit id 为历史提交记录的辨识号,每一次提交修改都会生成唯一的commit id。

5、查看历史git操作命令:

git reflog                                           //该命令可以查看历史操作内容,已经操作对应的commit -id

6、查看当前修改:

git diff <filename>                       //查看当前分支工作空间相对仓库最新内容的修改变动,<filename>  用于指定某个文件,忽略时显示所有文件的修改变动

git diff –cache <filename>        //查看当前分支工作空间相对缓存空间最新内容的修改变动,<filename>  用于指定某个文件,忽略时显示所有文件的修改变动

7、缓存空间内容回退到工作空间:

当想放弃增加入缓存空间的修改,重新编辑时,用指令:git reset <filename>             //未指定filename时,默认当前分支所有的文件。内容回退到工作空间只是状态的变化,并不会消失。

8、想要删除工作空间作出的修改:

  1. 修改未用git add 添加到缓存空间,直接使用命令:git checkout --<filename>          //删除工作空间作出的改动,工作空间内容和最新仓库中当前分支最新内容一致
  2. 修改已经加入到缓存空间,须首先用命令git reset <filename>将修改撤回工作空间,然后git checkout --<filename>删除修改

9、修改commit提交的log日志内容:

  1. 针对当前最新的commit 提交:

git commit --amend                                                                                                                         //编辑日志内容,确认保存即可实现修改

2.针对历史某次提交:

git rebase -i <commit id>                                                                                                             //进行历史提交的修改,按照弹出框指示进行操作即可

10、其他分支某次提交的修改内容的合并到当前分支:

git cherry-pick <commit-id>                                                                                                                //仅将commit id次提交的变动内容添加到当前分支

git cherry-pick <commit id0>..<commit idn>                                                                                 //将从commit id1 到 commit idn的连续多次修改提交合并到当前分支(左开右闭区间)

11、需要对提交历史进行合并等操作时,需要git rebase -i [commit id]                                          //对commit id后的提交记录进行修改操作,可以进行提交记录的合并、忽略、修改日志内容等操作,按提示进行即可

12、将本地分支内容推送到远端仓库:

git push<远程主机名><本地分支名>:<远程分支名>                                                                   //忽略本币分支名时,默认即当前分支;忽略远端分支时,默认远端与本地分支同名;主机默认origin

13、拉取远端仓库代码:

git pull <远程主机名> <远程分支名>:<本地分支名>                                                                    //忽略本币分支名时,默认即当前分支;忽略远端分支时,默认远端与本地分支同名;主机默认origin

图形化工具SourceTree

3.0.8普通用户版account.json跳过登陆注册方法已失效,请安装企业版

官网:https://www.sourcetreeapp.com...

跳过登陆办法

进入 sourcetree 目录, 在资源管理器中进入以下地址

%LocalAppData%\Atlassian\SourceTree\

放入以下文件 accounts.json

[
  {
    "$id": "1",
    "$type": "SourceTree.Api.Host.Identity.Model.IdentityAccount, SourceTree.Api.Host.Identity",
    "Authenticate": true,
    "HostInstance": {
      "$id": "2",
      "$type": "SourceTree.Host.Atlassianaccount.AtlassianAccountInstance, SourceTree.Host.AtlassianAccount",
      "Host": {
        "$id": "3",
        "$type": "SourceTree.Host.Atlassianaccount.AtlassianAccountHost, SourceTree.Host.AtlassianAccount",
        "Id": "atlassian account"
      },
      "BaseUrl": "https://id.atlassian.com/"
    },
    "Credentials": {
      "$id": "4",
      "$type": "SourceTree.Model.BasicAuthCredentials, SourceTree.Api.Account",
      "Username": "",
      "Email": null
    },
    "IsDefault": false
  }
]

GIT用户权限配置

  • 生成本机 SSH
ssh-keygen -t rsa -C "email@email.com"
// 一路回车结束
  • 生成密钥文件为:~/.ssh/id_rsa.pub ,可以用 cat ~/.ssh/id_rsa.pub 查看
  • 复制粘贴到 SSH设置
  • souretree 配置 GIT 用户权限

Git commit 规范参考文档

Header部分只有一行,包括三个字段:type(必需)、scope(可选)和subject(必需)。 type:

  • feat:新功能(feature)
  • fix:修补bug
  • docs:文档(documentation)
  • style: 格式(不影响代码运行的变动)
  • refactor:重构(即不是新增功能,也不是修改bug的代码变动)
  • test:增加测试
  • chore:构建过程或辅助工具的变动

coding完成后发布

以下以d3-foo 插件发布为例

Publish to GitHub

If you’re ready to share your code with the world, make your first commit:

git add .
git commit

Then create a new repository on GitHub. Add the git remote, and push:

git remote add origin git@github.com:{USERNAME}/d3-foo.git
git push -u origin master

Replace {USERNAME} with your GitHub user name and d3-foo with your plugin name, obvs.

Next, create a git tag that corresponds to the version in your package.json file. (If this is not your first release, you’ll also want to bump the version to 0.0.2, 0.1.0, or 1.0.0 as appropriate.) You can push commits as frequently as you like, but periodically you should bundle these commits together into a release. Tags are simply a mechanism for identifying releases in the repository.

git tag -a v0.0.1

(Alternatively, use npm version, which also edits the package.json file for you.)

Push the tag to GitHub:

git push --tags

Publish to NPM:

npm publish

As a side-effect of publishing, NPM will create a d3-foo.zip archive of your release in the build folder. Add this as a custom download to your GitHub releases (for example, see d3-shape) so that people can download your code without needing to use NPM.

Edit your release notes to tell people what’s changed!

Once you’ve published the first time, add your plugin to the wiki. If you want collaborators, let me know, and you can transfer your repository to the D3 organization and setup a team. You’ll retain admin rights and be able to publish new releases as often as you like!

把本地项目上传到github

https://jingyan.baidu.com/art...
图片描述
图片描述

常用命令

项目发布过程

仓库初始化

git init

查看仓库状态

git status

添加监控跟新文件

git add -A

提交

git commit -m

推送到远程仓库

git push 

图片描述

图片描述

图片描述

图片描述

更改本地并推送到远程仓库

图片描述

在commit之前撤销git add操作

http://stackoverflow.com/ques...

http://stackoverflow.com/ques...

遇到过的问题

github中git push origin master出错:error: failed to push some refs to

图片描述

图片描述

gitignore常见的内容

.DS_Store
.sizecache.json
/bower_components
/dist
/node_modules
npm-debug.log
yarn-error.log

新建develop分支

git checkout -b develop
//这时候在本地git仓库就建了一个develop分支,git status 会发现在develop分支下


//这时候我们可以继续编码
//当要push上远程的分支时候需要注意的是,远程还没有develop分支 所以我们可以
git push origin develop


git add .
git commit -m "“
git push --set-upstream origin develop

图片描述
这时候在远程也会发现多了一个develop分支

回滚历史版本

总结一下 Git 不同情况下如何回滚
在命令行使用git:
在工作区目录下输入 git reflog
可以查询出每个历史版本的commit,每个commit都有对应的ID,
确认好要退回的ID后输入:

git reset --hard 确认的ID

便可退回相应的历史版本
图片描述

Git merge VS rebase

http://chenjsh.cn/demo/demoge...
https://www.atlassian.com/git...

图片描述

如何移除 git 提交历史中关于某个文件的修改历史?

场景是这样的,在一次提交 PR 的 review 过程中,我提交的一个文件,在若干 commits 的修改下,最终和最初状态完全相同,但是 PR 中却保留了对该文件的提交历史,因此 reviewer 希望我可以将这个文件移除提交历史。

这个主要需要用到 git rebase ,步骤如下:

  • git log filename: 首先通过 git log 来查询要回滚到的 commit id
  • git reset commit-id filename: 对该文件进行 reset 操作(撤销提交历史相关的修改)
  • git checkout filename: 对其进行 checkout 操作(撤销对文件本身的修改)
  • git commit --amend: 修改提交历史信息
  • git rebase --continue/git push: 同步

Git dev分支合并到master分支

Git dev分支合并到master分支完美实战

待代码测试没问题,再将自己分支的内容合并到master 分支,然后提交到远程服务

git checkout master
git merge <branchname>
git push origin master

git tag 快照标签

git支持使用易记的字符串和附加信息为特定的快照打标签。你可以利用标签为开发树
(development tree)加上信息(例如Mergedin new memory management),使其更为清晰,或是标
记出分支上特定的快照。例如,用标签标出release-1分支上的release-1.0和release-1.1。
git支持轻量标签(仅为快照打标签)以及注解标签。
git标签仅在本地范围内有效。 git push 默认不会推送标签。要想把标签发送到origin仓库,
必须加上选项 --tags :

$ git push origin --tags

git tag 命令包括可以用于添加、删除和列出标签的选项。

不使用选项的 git tag 命令可以列出可见标签:

$ git tag
release-1.0
release-1.0beta
release-1.1

你可以通过添加标签名在当前检出中创建标签:

$ git tag ReleaseCandidate-1

在 gittag 命令中加入指定提交的SHA-1,就可以为该提交添加标签:

$ git log --pretty=oneline
bef4a35a67c6228cbeb05913302f96966ff33d01 fix
5bc4812c60222956e5157cc8c9a5f06156a7750b change config
4a8bae2f78c412065c8422821feaa4cc5a94c82b change to es6
36fa4f97a31be4bc410eb0b4e940c753485f1c90 fix: mongo docker
85aa77f7e4c03a3512f75c47f7568aef9f8a757f fix
:...skipping...
bef4a35a67c6228cbeb05913302f96966ff33d01 fix
5bc4812c60222956e5157cc8c9a5f06156a7750b change config
4a8bae2f78c412065c8422821feaa4cc5a94c82b change to es6
36fa4f97a31be4bc410eb0b4e940c753485f1c90 fix: mongo docker
85aa77f7e4c03a3512f75c47f7568aef9f8a757f fix
a3e6f734ad19d33889d2298111cde828147b4c01 node:10 => node:10:...skipping...
bef4a35a67c6228cbeb05913302f96966ff33d01 fix
5bc4812c60222956e5157cc8c9a5f06156a7750b change config
4a8bae2f78c412065c8422821feaa4cc5a94c82b change to es6
36fa4f97a31be4bc410eb0b4e940c753485f1c90 fix: mongo docker
85aa77f7e4c03a3512f75c47f7568aef9f8a757f fix
a3e6f734ad19d33889d2298111cde828147b4c01 node:10 => node:10.15.3-alpine
200e8e81fb285e8ef035cf51236ad5bedaac8393 feats: add dockerf:...skipping...
bef4a35a67c6228cbeb05913302f96966ff33d01 fix
5bc4812c60222956e5157cc8c9a5f06156a7750b change config
4a8bae2f78c412065c8422821feaa4cc5a94c82b change to es6
36fa4f97a31be4bc410eb0b4e940c753485f1c90 fix: mongo docker
85aa77f7e4c03a3512f75c47f7568aef9f8a757f fix
a3e6f734ad19d33889d2298111cde828147b4c01 node:10 => node:10.15.3-alpine
200e8e81fb285e8ef035cf51236ad5bedaac8393 feats: add dockerfile
:...skipping...
bef4a35a67c6228cbeb05913302f96966ff33d01 fix
5bc4812c60222956e5157cc8c9a5f06156a7750b change config
4a8bae2f78c412065c8422821feaa4cc5a94c82b change to es6
36fa4f97a31be4bc410eb0b4e940c753485f1c90 fix: mongo docker
85aa77f7e4c03a3512f75c47f7568aef9f8a757f fix
a3e6f734ad19d33889d2298111cde828147b4c01 node:10 => node:10.15.3-alpine
200e8e81fb285e8ef035cf51236ad5bedaac8393 feats: add dockerfile
2913f6ec026931ab2b189da91f10e0a43d1fee5e 添加readme
dcded2b55f7fd190a1cc8aee2aa5e6b1e50886bd jx_todo_app firstversion
# $ git tag menuComplete ad606b
git tag v1.0.1 bef4a35a67

选项 -a 可以为标签加入注解:

$ git tag -a tagWithExplanation

git会打开编辑器,创建注解

你可以在命令行中使用 -m 选项定义信息:

$ git tag -a tagWithShortMessage -m "A short description"

如果使用 git show 命令,会显示如下信息:

$ git show tagWithShortMessage
tag tagWithShortmessage
Tagger: Clif Flynt <clif@cflynt.com>
Date:
Fri Dec 23 09:58:19 2016 -0500 6
A short description
... 

选项 -d 可以删除标签:

$ git tag
tag1
tag2
tag3
$ git tag -d tag2
$ git tag
tag2
tag3F

can you delete mutiple branches in one command with git

git branch -D `git branch`| grep -E 'fix-*'

git stash

git stash(git储藏)可用于以下情形:

  • 发现有一个类是多余的,想删掉它又担心以后需要查看它的代码,想保存它但又不想增加一个脏的提交。这时就可以考虑git stash。
  • 使用git的时候,我们往往使用分支(branch)解决任务切换问题,例如,我们往往会建一个自己的分支去修改和调试代码, 如果别人或者自己发现原有的分支上有个不得不修改的bug,我们往往会把完成一半的代码commit提交到本地仓库,然后切换分支去修改bug,改好之后再切换回来。这样的话往往log上会有大量不必要的记录。其实如果我们不想提交完成一半或者不完善的代码,但是却不得不去修改一个紧急Bug,那么使用git stash就可以将你当前未提交到本地(和服务器)的代码推入到Git的栈中,这时候你的工作区间和上一次提交的内容是完全一样的,所以你可以放心的修Bug,等到修完Bug,提交到服务器上后,再使用git stash apply将以前一半的工作应用回来。
  • 经常有这样的事情发生,当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。解决这个问题的办法就是git stash命令。储藏(stash)可以获取你工作目录的中间状态——也就是你修改过的被追踪的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用。

git stash用法

stash当前修改

git stash会把所有未提交的修改(包括暂存的和非暂存的)都保存起来,用于后续恢复当前工作目录。
比如下面的中间状态,通过git stash命令推送一个新的储藏,当前的工作目录就干净了。

$ git status
On branch master
Changes to be committed:

new file:   style.css

Changes not staged for commit:

modified:   index.html

$ git stash
Saved working directory and index state WIP on master: 5002d47 our new homepage
HEAD is now at 5002d47 our new homepage

$ git status
On branch master
nothing to commit, working tree clean

需要说明一点,stash是本地的,不会通过git push命令上传到git server上。
实际应用中推荐给每个stash加一个message,用于记录版本,使用git stash save取代git stash命令。示例如下:

$ git stash save "test-cmd-stash"
Saved working directory and index state On autoswitch: test-cmd-stash
HEAD 现在位于 296e8d4 remove unnecessary postion reset in onResume function
$ git stash list
stash@{0}: On autoswitch: test-cmd-stash

重新应用缓存的stash

可以通过git stash pop命令恢复之前缓存的工作目录,输出如下:

$ git status
On branch master
nothing to commit, working tree clean
$ git stash pop
On branch master
Changes to be committed:

    new file:   style.css

Changes not staged for commit:

    modified:   index.html

Dropped refs/stash@{0} (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)

这个指令将缓存堆栈中的第一个stash删除,并将对应修改应用到当前的工作目录下。
你也可以使用git stash apply命令,将缓存堆栈中的stash多次应用到工作目录中,但并不删除stash拷贝。命令输出如下:

$ git stash apply
On branch master
Changes to be committed:

    new file:   style.css

Changes not staged for commit:

    modified:   index.html

查看现有stash

可以使用git stash list命令,一个典型的输出如下:


$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log

在使用git stash apply命令时可以通过名字指定使用哪个stash,默认使用最近的stash(即stash@{0})

移除stash

可以使用git stash drop命令,后面可以跟着stash名字。下面是一个示例:

$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log
$ git stash drop stash@{0}
Dropped stash@{0} (364e91f3f268f0900bc3ee613f9f733e82aaed43)

或者使用git stash clear命令,删除所有缓存的stash。

git 对比两个分支差异

  1. 显示出branch1和branch2中差异的部分

git diff branch1 branch2 --stat

  1. 显示指定文件的详细差异

git diff branch1 branch2 具体文件路径

  1. 显示出所有有差异的文件的详细差异

git diff branch1 branch2

  1. 查看branch1分支有,而branch2中没有的log

git log branch1 ^branch2

  1. 查看branch2中比branch1中多提交了哪些内容

git log branch1..branch2
注意,列出来的是两个点后边(此处即dev)多提交的内容。

  1. 不知道谁提交的多谁提交的少,单纯想知道有是吗不一样

git log branch1...branch2

  1. 在上述情况下,在显示出没个提交是在哪个分支上

git log --lefg-right branch1...branch2
注意 commit 后面的箭头,根据我们在 –left-right branch1…branch2 的顺序,左箭头 < 表示是 branch1 的,右箭头 > 表示是branch2的。

开发分支合并到master分支

clipboard.png

使用已有git仓库作为开发骨架

你在github上找到一个好的template,怎样在它的基础上做开发?

- git clone 该项目

  • `rm -rf .git/ && git init
  • 更改package.json name 为你的项目名
  • 更改 .env 等配置文件
  • 开始开发

常见错误

Another git process seems to be running in this repository, e.g.

image.png

解决方案: https://stackoverflow.com/que...

面向功能的常规操作

1、接收需求,下载项目并创建自己的修改分支

首先,在代码仓库中找到对应库,获取起Git 下载连接。如github上的golang/protobuf : https://github.com/golang/pro...

然后,在本地目录执行:git clone https://github.com/golang/pro...,就可以将整个项目源码下载到本地

建立自己的分支:为了开发便利和安全,修改项目代码最好尽力自己的分支进行开发,基本测试通过后,再将修改合并到项目的主分支中

git branch <your branch name> //建立自己的分支并为了命令

git branch -a //查看当前所有存在的分支

git checkout branch-name //切换到branch-name命令的分支

git branch -d branch-name //删除branch-name分支

2、在自己的分支上进行需求开发

自己分支按照需求进行项目的开发和基本功能测试,阶段性工作通过git add 、git commit 进行保存。

3、将自己开发内容合并到项目主干分支中

自己分支开发工作结束后,需要将开发内容合并到项目主干分支(master(线上分支)、staging(测试分支))中

git checkout master / git checkout staing // 切换到主干分支

git fetch //拉去远端仓库分支最新内容

git rebase //更新本地分支head与远端最新分支内容保持一直

git cherry-pick commit-id // 将自己分支上于本次需求修改相关的内容,合并到所在的主干分支(可能需要解决冲突问题)

git rebase -i commit-idn /对合并结果进行调整,合并不必要的commit 记录、修改log日志内容等

git push // 将当前本地分支最新修改推送到远端仓库

分支合并过程中,也可以使用git merge指令,但是合并效果不佳,可参考: https://blog.csdn.net/wh_1991...

参考

git 教程
Githug 通关攻略
沉浸式学 Git
git创建本地分支以及推送本地分之至远程分支
https://segmentfault.com/a/11...
git commit 规范指南
git 技巧
git-stash用法小结


白鲸鱼
1k 声望110 粉丝

方寸湛蓝