1.默认你已经安装了,git的客户端,这里我们使用git bash操作。
2.执行git init命令: git ini
3.在本地创建ssh key: ssh-keygen -t rsa -C "wuyan@qql.com"
4.不设置 任何秘密 回车下一步 生成key
4.1设置username和email
git config --global user.name "takhello0"
git config --global user.email "wuyan@qq.com"
5.进入提示的地址下查看ssh key文件
6.查看key
7.登陆git 设置ssh keys
8.测试是否可以成功链接: ssh -T git@github.com 如果出现 You’ve successfully authenticated, but GitHub does not provide shell access 成功连上github。
9.在git上建立仓库 不要添加文件
10.
-git add -A. # 添加所有文件到本地索引,命令用法:git add <file>
-git commit -m "My first commit operation" # 提交修改到本地仓库,-m选项添加提交注释
-git remote add origin git@github.com:yourName/gitHub的仓库地址.git # 添加远程仓库地址,保存在origin变量中
推送到远程共享库中 -git push origin master # 按照前一条命令中origin给定的github地址推送到github仓库的master分支
git push -u origin master
Git fetch origin master 获取远程仓库
git pull 切换目录(新用户),获取最新的文件:
git status 查看git仓库中各文件的当前状态
11.交互流程
12.目录简单说明
- hooks:这个目录存放一些shell脚本,可以设置特定的git命令后触发相应的脚本;在搭建gitweb系统或其他git托管系统会经常用到hook script
- info:包含仓库的一些信息
- objects:所有的Git对象都会存放在这个目录中,对象的SHA1哈希值的前两位是文件夹名称,后38位作为对象文件名
- refs:这个目录一般包括三个子文件夹,heads、remotes和tags,heads中的文件标识了项目中的各个分支指向的当前commit
- config:这个是GIt仓库的配置文件
- description:仓库的描述信息,主要给gitweb等git托管系统使用
- HEAD:这个文件包含了一个档期分支(branch)的引用,通过这个文件Git可以得到下一次commit的parent
13.代码clone
git clone <仓库地址或目录> /d/software/respository/<仓库名> <用户目录>
注意的是第一次需要使用clone命令将整个项目down到本地(类似svn的check),不是首次的话就可以直接使用git pull来同步更新代码了
1.在本地仓库里右键 Git Init Here
2.git init
3.在本地创建ssh key
ssh-keygen -t rsa -C "wuyan@qq.com"
4.设置username和email
git config --global user.name "takhello0"
git config --global user.email "wuyan@qq.com"
4.0 git remote add origin git@github.com:yourName/gitHub的仓库地址.git
4.1在gitHub上建立仓库 不要添加文件
5.
git add 文件名
git add -A
6.git commit -m "备注"
7.git remote add origin 你提交的地址
8.git push -u origin master
获取远程仓库
Git fetch origin master
补充收集 一:git提交忽略文件或文件夹
在项目根目录下面 添加 .gitignore文件
文件中每一行表示需要忽略的文件的正则表达式.
.gitignore文件过滤有两种模式,开放模式和保守模式
1. 开放模式负责设置过滤哪些文件和文件夹
例如: /target/ 表示项目根目录下的target文件夹里面所有的内容都会被过滤,不被GIT 跟踪
.classpath 表示项目根目录下的.classpath文件会被过滤,不被GIT跟踪
2. 保守模式负责设置哪些文件不被过滤,也就是哪些文件要被跟踪。
例如:
!/target/*.h 表示target文件夹目录下所有的.h文件将被跟踪
另外别忘记了在.gitignore文件中加入一行.gitignore,否则的话.gitignore将会被传到GIT服务器上
规则写法
1. 在已忽略文件夹中不忽略指定文件夹
/node_modules/*
!/node_modules/layer/
2. 在已忽略文件夹中不忽略指定文件
/node_modules/*
!/node_modules/layer/layer.js
【注意项】注意写法 要忽略的文件夹一定要结尾 /* ,否则不忽略规则将无法生效
3. 其他规则写法 (附)
以斜杠“/”开头表示目录;
以星号“*”通配多个字符;
以问号“?”通配单个字符
以方括号“[]”包含单个字符的匹配列表;
以叹号“!”表示不忽略(跟踪)匹配到的文件或目录;
1、忽略文件
*.bak # 忽略所有扩展名为.bak的文件
!keep.bak # 但keep.bak文件除外(不会被忽略)
temp/test.txt # 忽略temp目录下的test.txt文件
temp/*.txt # 忽略temp目录下所有扩展名为.txt的文件
2、忽略目录
temp/ # 忽略temp目录下的所有目录和文件
temp/*/ # 忽略temp目录下的所有目录,但不会忽略该目录下的文件
补充收集 二: 错误处理
如果输入$ git remote add origin git@github.com:djqiang(github帐号名)/gitdemo(项目名).git
提示出错信息:fatal: remote origin already exists.
解决办法如下:
1、先输入$ git remote rm origin
2、再输入$ git remote add origin git@github.com:djqiang/gitdemo.git 就不会报错了!
3、如果输入$ git remote rm origin 还是报错的话,error: Could not remove config section 'remote.origin'. 我们需要修改gitconfig文件的内容
4、找到你的github的安装路径,我的是C:\Users\ASUS\AppData\Local\GitHub\PortableGit_ca477551eeb4aea0e4ae9fcd3358bd96720bb5c8\etc
5、找到一个名为gitconfig的文件,打开它把里面的[remote "origin"]那一行
删掉就好了!
如果输入$ ssh -T git@github.com
出现错误提示:Permission denied (publickey).因为新生成的key不能加入ssh就会导致连接不上github。
解决办法如下:
1、先输入$ ssh-agent,再输入$ ssh-add ~/.ssh/id_key,这样就可以了。
2、如果还是不行的话,输入ssh-add ~/.ssh/id_key 命令后出现报错Could not open a connection to your authentication agent.解决方法是key用Git Gui的ssh工具生成,这样生成的时候key就直接保存在ssh中了,不需要再ssh-add命令加入了,其它的user,token等配置都用命令行来做。
3、最好检查一下在你复制id_rsa.pub文件的内容时有没有产生多余的空格或空行,有些编辑器会帮你添加这些的。
如果输入$ git push origin master
提示出错信息:error:failed to push som refs to .......
解决办法如下:
1、先输入$ git pull origin master //先把远程服务器github上面的文件拉下来
2、再输入$ git push origin master
3、如果出现报错 fatal: Couldn't find remote ref master或者fatal: 'origin' does not appear to be a git repository以及fatal: Could not read from remote repository.
4、则需要重新输入$ git remote add origingit@github.com:djqiang/gitdemo.git
使用git在本地创建一个项目的过程
$ makdir ~/hello-world //创建一个项目hello-world
$ cd ~/hello-world //打开这个项目
$ git init //初始化
$ touch README
$ git add README //更新README文件
$ git commit -m 'first commit' //提交更新,并注释信息“first commit”
$ git remote add origin git@github.com:defnngj/hello-world.git //连接远程github项目
$ git push -u origin master //将本地项目更新到github项目上去
gitconfig配置文件
Git有一个工具被称为git config,它允许你获得和设置配置变量;这些变量可以控制Git的外观和操作的各个方面。这些变量可以被存储在三个不同的位置:
1./etc/gitconfig 文件:包含了适用于系统所有用户和所有库的值。如果你传递参数选项’--system’ 给 git config,它将明确的读和写这个文件。
2.~/.gitconfig 文件 :具体到你的用户。你可以通过传递--global 选项使Git 读或写这个特定的文件。
3.位于git目录的config文件 (也就是 .git/config) :无论你当前在用的库是什么,特定指向该单一的库。每个级别重写前一个级别的值。因此,在.git/config中的值覆盖了在/etc/gitconfig中的同一个值。
在Windows系统中,Git在$HOME目录中查找.gitconfig文件(对大多数人来说,位于C:\Documents and Settings\$USER下)。它也会查找/etc/gitconfig,尽管它是相对于Msys 根目录的。这可能是你在Windows中运行安装程序时决定安装Git的任何地方。
配置相关信息:
2.1 当你安装Git后首先要做的事情是设置你的用户名称和e-mail地址。这是非常重要的,因为每次Git提交都会使用该信息。它被永远的嵌入到了你的提交中:
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
2.2 你的编辑器(Your Editor)
现在,你的标识已经设置,你可以配置你的缺省文本编辑器,Git在需要你输入一些消息时会使用该文本编辑器。缺省情况下,Git使用你的系统的缺省编辑器,这通常可能是vi 或者 vim。如果你想使用一个不同的文本编辑器,例如Emacs,你可以做如下操作:
$ git config --global core.editor emacs
2.3 检查你的设置(Checking Your Settings)
如果你想检查你的设置,你可以使用 git config --list 命令来列出Git可以在该处找到的所有的设置:
$ git config --list
你也可以查看Git认为的一个特定的关键字目前的值,使用如下命令 git config {key}:
$ git config user.name
2.4 获取帮助(Getting help)
如果当你在使用Git时需要帮助,有三种方法可以获得任何git命令的手册页(manpage)帮助信息:
$ git help <verb>
$ git <verb> --help
$ man git-<verb>
例如,你可以运行如下命令获取对config命令的手册页帮助:
$ git help config
Git命令
服务器端(remote)的情况:
git的服务器端(remote)端包含多个repository,每个repository可以理解为一个项目。而每个repository下有多个branch,此处各个branch的意义,可以参考这篇文章。"origin"就是指向某一个repository的指针。服务器端的"master"(强调服务器端是因为本地端也有master)就是指向某个repository的一个branch的指针。
这是服务器端(remote)的情况:
本地电脑(local)上:"master"就是指向刚刚从remote server传到本地的副本branch。
查看、添加、提交、删除、找回,重置修改文件
1.新建代码库
# 在当前目录新建一个Git代码库
$ git init
# 新建一个目录,将其初始化为Git代码库
$ git init [project-name] # 下载一个项目和它的整个代码历史 $ git clone [url]
2.配置
Git的设置文件为.gitconfig
,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)。
# 显示当前的Git配置
$ git config --list
# 编辑Git配置文件
$ git config -e [--global] # 设置提交代码时的用户信息 $ git config [--global] user.name "[name]" $ git config [--global] user.email "[email address]"
3.增删文件
# 添加指定文件到暂存区 $ git add [file1] [file2] ... # 添加指定目录到暂存区,包括子目录 $ git add [dir] # 添加当前目录的所有文件到暂存区 $ git add . # 添加每个变化前,都会要求确认 # 对于同一个文件的多处变化,可以实现分次提交 $ git add -p # 删除工作区文件,并且将这次删除放入暂存区 $ git rm [file1] [file2] ... # 停止追踪指定文件,但该文件会保留在工作区 $ git rm --cached [file] # 改名文件,并且将这个改名放入暂存区 $ git mv [file-original] [file-renamed]
4.提交文件
# 提交暂存区到仓库区
$ git commit -m [message]
# 提交暂存区的指定文件到仓库区 $ git commit [file1] [file2] ... -m [message] # 提交工作区自上次commit之后的变化,直接到仓库区 $ git commit -a # 提交时显示所有diff信息 $ git commit -v # 使用一次新的commit,替代上一次提交 # 如果代码没有任何新变化,则用来改写上一次commit的提交信息 $ git commit --amend -m [message] # 重做上一次commit,并包括指定文件的新变化 $ git commit --amend [file1] [file2] ...
9.撤销操作
# 恢复暂存区的指定文件到工作区
$ git checkout [file]
# 恢复某个commit的指定文件到暂存区和工作区
$ git checkout [commit] [file] # 恢复暂存区的所有文件到工作区 $ git checkout . # 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变 $ git reset [file] # 重置暂存区与工作区,与上一次commit保持一致 $ git reset --hard # 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变 $ git reset [commit] # 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致 $ git reset --hard [commit] # 重置当前HEAD为指定commit,但保持暂存区和工作区不变 $ git reset --keep [commit] # 新建一个commit,用来撤销指定commit # 后者的所有变化都将被前者抵消,并且应用到当前分支 $ git revert [commit] # 暂时将未提交的变化移除,稍后再移入 $ git stash $ git stash pop
5.分支处理
# 列出所有本地分支
$ git branch
# 列出所有远程分支
$ git branch -r
# 列出所有本地分支和远程分支
$ git branch -a # 新建一个分支,但依然停留在当前分支 $ git branch [branch-name] # 新建一个分支,并切换到该分支 $ git checkout -b [branch] # 新建一个分支,指向指定commit $ git branch [branch] [commit] # 新建一个分支,与指定的远程分支建立追踪关系 $ git branch --track [branch] [remote-branch] # 切换到指定分支,并更新工作区 $ git checkout [branch-name] # 切换到上一个分支 $ git checkout - # 建立追踪关系,在现有分支与指定的远程分支之间 $ git branch --set-upstream [branch] [remote-branch] # 合并指定分支到当前分支 $ git merge [branch] # 选择一个commit,合并进当前分支 $ git cherry-pick [commit] # 删除分支 $ git branch -d [branch-name] # 删除远程分支 $ git push origin --delete [branch-name] $ git branch -dr [remote/branch]
6.标签
# 列出所有tag
$ git tag
# 新建一个tag在当前commit
$ git tag [tag]
# 新建一个tag在指定commit $ git tag [tag] [commit] # 删除本地tag $ git tag -d [tag] # 删除远程tag $ git push origin :refs/tags/[tagName] # 查看tag信息 $ git show [tag] # 提交指定tag $ git push [remote] [tag] # 提交所有tag $ git push [remote] --tags # 新建一个分支,指向某个tag $ git checkout -b [branch] [tag]
7.查看信息
# 显示有变更的文件
$ git status
# 显示当前分支的版本历史
$ git log
# 显示commit历史,以及每次commit发生变更的文件
$ git log --stat
# 搜索提交历史,根据关键词 $ git log -S [keyword] # 显示某个commit之后的所有变动,每个commit占据一行 $ git log [tag] HEAD --pretty=format:%s # 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件 $ git log [tag] HEAD --grep feature # 显示某个文件的版本历史,包括文件改名 $ git log --follow [file] $ git whatchanged [file] # 显示指定文件相关的每一次diff $ git log -p [file] # 显示过去5次提交 $ git log -5 --pretty --oneline # 显示所有提交过的用户,按提交次数排序 $ git shortlog -sn # 显示指定文件是什么人在什么时间修改过 $ git blame [file] # 显示暂存区和工作区的代码差异 $ git diff # 显示暂存区和上一个commit的差异 $ git diff --cached [file] # 显示工作区与当前分支最新commit之间的差异 $ git diff HEAD # 显示两次提交之间的差异 $ git diff [first-branch]...[second-branch] # 显示今天你写了多少行代码 $ git diff --shortstat "@{0 day ago}" # 显示某次提交的元数据和内容变化 $ git show [commit] # 显示某次提交发生变化的文件 $ git show --name-only [commit] # 显示某次提交时,某个文件的内容 $ git show [commit]:[filename] # 显示当前分支的最近几次提交 $ git reflog
# 从本地master拉取代码更新当前分支:branch 一般为master
$ git rebase [branch]
8.远程同步
# 下载远程仓库的所有变动
$ git fetch [remote]
# 显示所有远程仓库
$ git remote -v # 显示某个远程仓库的信息 $ git remote show [remote] # 增加一个新的远程仓库,并命名 $ git remote add [shortname] [url] # 取回远程仓库的变化,并与本地分支合并 $ git pull [remote] [branch] # 上传本地指定分支到远程仓库 $ git push [remote] [branch] # 强行推送当前分支到远程仓库,即使有冲突 $ git push [remote] --force # 推送所有分支到远程仓库 $ git push [remote] --all
10.其他
# 生成一个可供发布的压缩包
$ git archive
11.分支对比
git log dev ^master 查看 dev 有,而 master 中没有的
git log master ^dev master 中有,而 dev 中没有的内容
异常记录:
1.问题1 add时出现警告
解决方案
git config --global core.autocrlf false
原因:
原因是路径中存在 / 的符号转义问题,false就是不转换符号默认是true,相当于把路径的 / 符号进行转义,这样添加的时候就有问题
2.错误2
2、npm run -s precommit (node v8.9.3)
huideMacBook-Pro:graph huiyu$ git commit -m “更新代码”
husky > npm run -s precommit (node v8.9.3)
fatal: Not a git repository: ‘.git’
husky > pre-commit hook failed (add –no-verify to bypass)
解决:
git commit -m “更新代码” -n
181115 新增
需求:在本地建立分支
1.git init 初始化
2.git add. 暂存
3.git commit -m 'first' 提交
4.git branch testVersions 新建分支 ‘testVersions’
5.git branch -a 查看所有分支
6.git checkout testVersions 切换到分支‘testVersions’
7.git checkout -b dev1 新建分支dev1 并切换到dev1
需求:对未修改完成的分支进行保存
1.git stash / git stash save “修改的信息" 可以隐藏调未完成的修改
2.git stash list 查看未修改完成的保存
3. git stash apply / git stash apply stash@{0} 取出未修改完的保存
git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。
git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。
git stash list: 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。
git stash clear: 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。
补充:
切回原来分支 使用 git cherry-pick [commit id] 的方式,将另一分支的提交转到当前分支提交。
需求:控制版本
1. 建立多个分支
feature分支 (开发使用)
release分支 (测试中出现的bug修改)
hotfixes分支 (master中出现的bug修改)
盗图(~~)
指南:https://git-scm.com/book/zh/v1/