学习记录----git学习点滴

Github基本操作:
达成目标:通过github基础操作,学会使用Github去管理在线环境中使用的代码、配置、资源等实验相关文件,去添加、同步和下拉在远程仓库中的实验文件,以此来维持自身的实验进度
1、SSH公私钥生成: ssh-keygen 命令(一路回车),生成的命令默认保存在.ssh(隐藏的)文件夹下,分为id_rsa(私钥)和id_rsa.pub(公钥)
2、创建github账号(已有忽略此步骤),首页——Start a project---勾选Public(默认已勾选)--勾选Initialize this repository with a README----Create repository--完成创建
3、关联公钥到Github账号下:复制id_rsa.pub内容,在Github--点击右上角头像的下拉按钮--选择Settings---选择左边的SSH and GPG keys---点击右上角New SSH key 按钮--填写Title 和 Key----点击Add SSH key提交
4、安装Git工具:yum 安装
5、配置用户名与邮箱:get config --global user.name 用户名
get config --global user.email 邮箱
执行这两个命令后,会在当前目录下生产一个隐藏的文件 .gitconfig ,内容是name和email
改文件是Git全局配置文件,一般配置方法是: git config --global 配置名称 配置的值
如果你想使项目里的某个值与前面的全局设置有区别(例如把私人邮箱地址改为工作邮箱),你可以在项目中使用git config 命令不带 --global 选项来设置. 这会在你当前的项目目录下创建 .git/config,从而使用针对当前项目的配置

基础配置好后,接下来是实验步骤:
创建并初始化Git仓库:
1、创建代码目录 ,如:mkdir project
2、切换到代码目录,并初始化Git仓库:cd project ; git init
3、ls -al 查看到会创建一个隐藏的 .git 目录,意味着一个仓库被初始化了
克隆远程仓库(Github上的仓库)到本地个人PC:
点击Clone or download按钮--选择Use SSH 或 Use HTTPS--点击复制按钮,复制链接
Use SSH 和 Use HTTPS的区别在于:Use SSH 不需要输入账号和密码;Use HTTPS每次同步改动都需要手动输入Github的用户名和密码
查看当前git仓库的状态(需要先切换到当前的git仓库): git status
Untracked 状态表示文件未加入本地缓冲区
查看缓存区中哪些文件被修改了(差别): git diff --cached ,输入q才可以退出这个状态
如果没有--cached参数,git diff 会显示当前你所有已做的但没有加入到索引里的修改
也可以加上路径限定符,来只比较某一个文件或目录:如:git diff 分支名 文件名/路径名
--stat 参数可以统计一下有哪些文件被改动,有多少行被改动

将本地仓库与远程仓库关联(针对于使用git init初始化的本地仓库):
git remote add origion git仓库地址
git remote add 命令用于添加远程主机,origin 是主机名,我们可以自定义
git 仓库地址 是自己的远程仓库地址(即github仓库地址)
如:git remote add origin https://github.com/yingque/novel_insect.git
克隆命令: git clone 要复制的仓库链接
Git URL可能以ssh://, http(s)://, git:// 开头
如果使用的是Zsh shell,则zsh会自动把目前所在的git分支显示在提示符中
本地查看克隆下来的仓库内容: cd 仓库名---ls
添加实验文件到本地索引库:git add 文件名/路径名
例如: echo “文件内容” >> 文件名 #先创建文件
git add 文件名 #先将文件移动到仓库下,再添加到本地索引库中
删除仓库(本地)里的文件:git rm [rm参数选项] 文件名/路径名
撤销:即将本地仓库里的改动撤销回到从git克隆下来的状态(如果改动之后执行了提交动作就无法再撤销,只能从远程仓库重新克隆一份到本地)
git reset --hard HEAD (在本地仓库目录下输入此命令行)
提交仓库的改动:git commit -m 提交的备注信息
推送改动到远程仓库中(必须先提交改动):git push [-u] origin 分支名
分支名默认为master;第一次推送改动可以使用-u参数,使用后会绑定这次的仓库分支名,这样下一次推送就不需要加上分支名了
本地查看远程仓库的改动(更新): git fetch origin (在本地仓库目录下输入此命令行)
下拉仓库同步:git pull origin 分支名 分支名默认为master

git的基本流程如下:
1、创建或修改文件
2、使用git add命令添加新创建或修改的文件到本地的缓存区(Index)
3、使用git commit命令提交到本地代码库,加-m参数,后接“备注”
4、(可选,有的时候并没有可以同步的远端代码库)使用git push命令将本地代码库同步到远端代码库
需要注意的是如果是修改文件,也需要使用git add命令添加到缓存区才可以提交。如果是删除文件,则直接使用git rm命令删除后会自动将已删除文件的信息添加到缓存区,git commit提交后就会将本地仓库中的对应文件删除

Git的分支与合并:
Git的分支可以让你在主线(master分支)之外进行代码提交,同时又不会影响代码库主线
1、创建分支: git branch 分支名 ;
-d 参数是删除分支;如: git branch -d 分支名
git branch 可查看当前的分支列表,以及目前的开发环境处在哪个分支上;

  • 代表当前在哪个分支下
    2、切换分支: git checkout 分支名
    3、分支的合并: git merge -m ‘merge 分支名 branch’ 分支名
    -m 参数是需要填写合并的注释信息
    如果两个分支都修改了同一个文件,则合并时会失败
    合并失败后先用git status查看状态,会发现文件显示为both modified
    手动解决冲突的流程:使用vim编辑冲突的文件,去掉git在自动产生标注冲突的<<<<<<等符号,根据需要只保留我们需要的内容后保存,然后使用git add 文件名和git commit-m 文件名 命令来提×××并后的文件内容
    4、当不再需要分支时,使用 git branch -d 分支名 删除分支即可
    git branch -d只能删除那些已经被当前分支合并的分支. 如果你要强制删除某个分支的话就用git branch –D
    5、撤销一个合并:git reset --hard HEAD
    6、查看日志:git log 显示所有的提交(commit),按q退出,按回车会逐行显示
    Man git log 或 git help log 可查看git log 使用帮助
    7、日志统计:git log --stat 会显示在每个提交(commit)中哪些文件被修改了,这些文件分别添加或删除了多少行内容,这个命令相当于打印详细的提交记录
    8、格式化日志:git log --pretty=oneline 或 git log --pretty=short
    也可用medium,full,fuller,email 或raw。 如果这些格式不完全符合你的需求, 你也可以用--pretty=format参数定义格式
    9、日志排序:要指定一个特定的顺序,可以为git log命令添加顺序参数;默认情况,提交
    按逆时间顺序显示,可以指定 --topo-order 参数,让提交按拓扑顺序来显示
    如: git log --pretty=format:’%h : %s’ --topo-order --graph
    --reverse 参数来逆向显示所有提交日志

公共Git仓库:
如果你和维护者都在同一台机器上有帐号,那么你们可以互相从对方的仓库目录里直接拉所作的修改,git命令里的仓库地址也可以是本地的某个目录名:
如:git clone /path/to/repository
git pull /path/to/other/repository
也可以是一个ssh地址:git clone ssh://yourhost/~you/repository

将修改推到一个公共仓库:
用git push命令,推送本地的修改到远程Git仓库,执行下面的命令:
$ git push ssh://yourserver.com/~you/proj.git master:master
或者
$ git push ssh://yourserver.com/~you/proj.git master
git push命令的目地仓库可以是ssh或http/https协议访问
推送代码失败时,推送结果不是快速向前fast forward,报错时,先 git pull 下获取远端仓库的最新更新

Git标签:
创建轻量级标签:用git tag 不带任何参数创建一个标签(tag)指定某个提交(commit)
先使用git log 查看显示结果中commit 后字符的前8位
git tag 标签名(自定义) 前8位字符
Git tag 查看当前已有的tag
如: git tag stable-1 8c315325
标签对象:为一个tag添加注释,或是为它添加一个签名
git tag 后接 -a , -s ,或是 -u 三个参数中任意一个,都会创建一个标签对象,并且需要一个标签消息(tag message)来为tag添加注释;如果没有-m 或是 -F 这些参数,命令执行时会启动一个编辑器来让用户输入标签消息
当这样的一条命令执行后,一个新的对象被添加到Git对象库中,并且标签引用就指向了一个标签对象,而不是指向一个提交,这就是与轻量级标签的区别
如: git tag -a stable-2 8c315325 -m “stable 2”

签名的标签: 签名标签可以让提交和标签更加完整可信。如果你配有GPG key,那么你就很容易创建签名的标签。首先你要在你的 .git/config 或 ~/.gitconfig 里配好key
示例:[user]
signingkey = <gpg-key-id>
或用命令行来配置:
git config (--global) user.signingkey <gpg-key-id>
现在你可以在创建标签的时候使用-s 参数来创建“签名的标签”:
$ git tag -s stable-1 1b2e1d63ff
如果没有在配置文件中配GPG key,你可以用-u参数直接指定。
$ git tag -u <gpg-key-id> stable-1 1b2e1d63ff

通过在顶层工作目录中添加一个叫 .gitignore的文件,来告诉Git系统要忽略掉哪些文件

git命令合集:
git init repo #初始化一个叫repo的本地git仓库
#实际上就是创建一个repo的目录,然后目录下放一个.git,.git包含了git的所有记录,判断一个目录是否为git仓库,就看有没有.git目录,有.git目录往下都属于同一个git仓库 #如果你把.git这个目录删除了,你的代码虽然还在,但是你的历史变更记录就全部没有了,所以一般别动这个.git

git add file #往暂存区添加一个叫file的文件
git diff #对比修改内容和git中最新记录的commit的区别,最好在add之前用git diff看一看,避免一些像加了空白键那种无效提交
git add . #往暂存区添加在git status中提示需要add的文件(git status不会提示被.gitignore忽略的文件)
git commit -m "blablabla" #把暂存区的内容正式提交到本地的当前分支,其中那个blablabla就是对本次提交的说明
git commit # 最近实践发现加了-m,我会尽可能挤成一行来写,但是push到github后,查看commit的时候就发现写的记录信息全部挤在一行,难看死了,有些还被忽略了 # 所以不如直接git commit记录比较全面的信息 # 不过之前得先指定git config --global core.editor /usr/bin/vim,不然貌似默认用的是vi,vi的话就有可能在你保存的时候会崩溃 # 以至于你写的一堆提交信息全没了.#git commit 还有一个-a的选项,是表示连同未add的文件改动也一同加进来,因为你可能add以后又改动了文件,而一般你前面add了内容就只用-m就可以了,不用-am
git status #查看当前所在git仓库情况
git log #查看提交历史,你会看到你自己之前commit时候的说明,各种blablabla
git reflog #查看操作历史
git clone HTTPS/SSH #克隆一个项目 # 常见的要么就是长成https型的(e.g. https://github.com/tesseract-ocr/tesseract.git) # 要么就是长成ssh型的(e.g. [email protected]:tesseract-ocr/tesseract.git)
git remote -v #查看远程代码仓库的信息
git remote add origin HTTPS/SSH #添加一个叫origin远程仓库地址,一般克隆自带,如果是本地新创建的话就得执行这句,然后才能push
git remote remove origin #删除一个叫origin远程仓库地址
git push origin <本地分支>:<远程分支> #如果没有冒号后面的,此时默认推送到远程origin仓库的与<本地分支>同名的分支,如果不存在,则会被新建
git fetch --all #这条命令一般用于如果有人远程push了一条分支到repo,你本地想要拉下来,直接checkout提示本地没有,就可以fetch全部分支了~
git pull origin <远程分支>:<本地分支> #如果没有冒号后面的,此时默认拉取并合并远程仓库origin的 <远程分支>到当前分支,pull相当于fetch+merge
git pull --rebase origin dev <远程分支>:<本地分支> #拉取远程git代码仓库origin的dev分支更新,并以重建的方式合并到本地分支 #一般要是嫌麻烦,就像上面那样直接pull就好了,有些洁癖者喜欢用rebase保证本地的线性干净,本地可以rebase,远程就别这么做了
git merge --no-ff dev master #合并本地dev分支到master分支,洁癖者会为了干净历史加上--no-ff选项(--no-ff意思是no fast forward非快进式合并,某公司面试问了--no-ff含义)
git merge --no-ff dev #合并本地dev分支到本地当前分支,洁癖者会为了干净历史加上--no-ff选项 #冲突解决:在pull 和merge的时候会因为合并双方文件内容不一样而导致冲突,它会显示给你发生冲突的文件,并自动在冲突文件中标注好不一样的段落 #解决冲突其实已经有很多很好的工具了(比如vimdiff之类的),但是我觉得这些工具都稍显得复杂不简约,所以我推荐直接用vim打开发生冲突的脚本,手动修改好,保存 #用vim修改(sublime也不错)清晰方便,再add==>commit==>push就没问题了(第二次push是以你修改后提交为准,git这时候并不理会远程仓库的文件内容,直接覆盖过去~) #或者修改好冲突以后就git add冲突的文件,再git merge --continue或者git rebase --continue,省去了commit的功夫
git branch #显示本地所有分支
git branch -D dev #-D是-d --force的shotcut,强制删除dev本地分支
git push origin :dev #删除远程仓库的dev分支,相当于把一个空分支push到远程仓库的dev上,等同于删除该分支。
git checkout -b dev #切换到dev分支,-b是没有dev分支时候才需要加上去的,这种情况下是创建并切换到dev分支的意思
git checkout -- file #撤销工作区中一个叫file的文件的修改
git reset HEAD file #撤销暂存区中一个叫file的文件到工作区中
git reset --hard HEAD^ #回滚当前分支到上一个版本,注意末尾的^,有n个^说明回滚多上个版本,也就是回到多少次commit前 #貌似把上面的file 换成(wildcard)通配符来代指所有是可以的.我就经常多文件撤销工作区修改的时候git checkout -- ,纯粹因为懒得一个个输入...

git stash 缓存工作区修改
git stash list 当前的git stash栈打印出来
git stash pop 恢复所缓存内容
git stash clear 清除全部所缓存内容
git stash pop 相当于 git stash apply 加 git stash drop

猜你喜欢

转载自blog.51cto.com/3134965/2151086