我的Git总结

前言

每次git都在百度,终于这次十一整理了一下自己当前所学的git知识.
这篇文章只是我的个人总结方便记忆用的,并不适合初学者来学习git.

声明

文中部分内容来源于网络,感谢大家的分享

git帮助文档

git [命令] -h简要形式
git [命令] --helpman文档
man git

1 初始化仓库

1.1 git init和.gitignore

在仓库目录下git init即可,
初始化后最好立即写好.gitignore文件,防止把不该跟踪的文件跟踪了,
.gitignore 对于已commit过的文件是不会忽略的
以斜杠“/”结尾表示目录,开头表示仓库根目录开始
  以星号*通配多个字符;
  以问号?通配单个字符
  以方括号[]包含单个字符的匹配列表;
  以叹号!表示不忽略(跟踪)匹配到的文件或目录;

1.2 git clone

  1. git clone https://github.com/silicon621600/leetcode.git
    默认clone整个远程仓库,但本地默认创建一个master分支,且默认是关联分支

  2. git clone -b dev https://github.com/silicon621600/leetcode.git
    clone整个远程仓库,并且在本地创建名为dev的远程dev分支的关联分支,其实就是等价于clone 加 checkout

    此时可以查看分支情况:
    git branch 查看本地分支
    git branch –r查看所有远程分支名
    git branch -a查看所有分支(包括本地和远程)
    git branch -vv查看分支详细,可以配合-r -a使用, v可以一个或两个,两个能够查看其关联的远程分支
    远程分支表示为 (远程仓库名)/(分支名) origin只是个一般使用的名字

git checkout (远程仓库名)/(分支名) -b (本地分支名)
在本地创建但是不是对应远程分支的关联分支,分支名可以不一样
git checkout -t (远程仓库名)/(分支名) 
 就是上一条命令的简写版,默认本地分支名和远程的一样
git fetch origin (远程分支名):(本地分支名)
chekcout -b相比,不是关联分支,而且成功后不会跳转到新分支
可以之后建立关联分支:
git fetch origin python_mail.skin:python_mail.skin
然后哦再加关联分支
git branch --track my_branch github/my_branch
git branch --set-upstream-to=upstream/foo foo
本地分支名省略的话,默认就是当前所在分支,
--track可省略为-t另外--set-upstream-to可省略为-u
还有一个--set-upstream 已被deprecated

关联分支的好处在于pull和push时可以省略分支名

1.3 其它

例如:现在本地init了仓库,然后想要push到远端仓库????

  1. 先clone,然后把修改迁移到新仓库
    缺点:你做的git commit可能就没了
  2. 直接push
    git remote add 远程仓库地址
    git fetch
    git merge
    git push
    缺点:出现冲突是很可能的情况

2 一般工作

2.1 checkout

git checkout (分支名) 切换分支
git checkout -b (分支名)创建并切到新分支相当于git branch (分支名)+git checkout (分支名)

2.2 add & commit

在当前分支,做了一些修改后
git status
git add -A 把修改添加到暂存区
git commit -m "修改信息"

注意: 暂存区始终只有一个,push前,转换分支前最好commit或stash掉,不然可能会在带到远程仓库或新分支处(这种情况出现在新建文件时,修改文件是无法转换分支的)

想要修改,有以下情况(git status会有提示):

  1. git checkout filename
    对于已修改的尚未添加到暂存区的文件,把这个文件恢复到上次commit版本时的状态,相当于取消了更改,这是危险的操作,恢复不了
  2. git reset HEAD filename reset默认是--mixed
    把这个文件恢复到执行git add 前的状态,文件的修改还在,只是不在暂存区了

撤销commit,很多种情况:
1.漏交了修改,
git commit -m 'initial commit'
git add forgotten_file
git commit --amend
commit只有一个
2.提交错误,需要回退,并且还没有push
git reset [参数] [版本号]
参数有
--mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码(文件不会变),回退commit和index信息
-–soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可.就是mixed基础上用add命令添加到暂存区
-–hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容
版本号:可用git log查看,输前几位即可
也可以用HEAD表示当前 HEAD^表示上一个版本 HEAD^^上上个版本HEAD~100 上100个
3. 如果错误修改已经push的话
那么reset之后再push是不行的,因为远程仓库的版本比你新,
一种方法是fetch远程分支,本地合并后再push
还有就是:
git revert 版本号
用于反转提交,执行evert命令时要求工作树必须是干净的.
用一个新提交来消除一个历史提交所做的任何修改.
新提交很关键,版本向前走,所以代码回退后能够直接push.

  1. 撤销reset --hard

在 Git 中任何 已提交的 东西几乎总是可以恢复的。

git relog可以看到每次操作的版本号,根据版本号回退即可,但是注意删除的commit的记录是有时间的,可能会被git丢弃,一般30天

2.3 查看commit信息

git log
结果像这样
commit 8cafb7c87b129686da362b14c3f3c750c1fe4bf5
Author: Henry Garcia hgarc014@ucr.edu
Date: Sun Nov 30 18:29:35 2014 -0800

    Initial commit
(END)

参数:
-p 显示具体修改
-[数字]限制commit数量
--stat  显示代码增改行数,代码审查时用
--pretty=oneline 一行显示
--pretty=format:"%h - %an, %ar : %s" 定制format
%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 -date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式显示
%s 提交说明

--shortstat 只显示 --stat 中最后的行数修改添加移除统计。
--name-only 仅在提交信息后显示已修改的文件清单。
--name-status 显示新增、修改、删除的文件清单。
--abbrev-commit 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。
--relative-date 使用较短的相对时间显示(比如,“2 weeks ago”)。
--graph 显示 ASCII 图形表示的分支合并历史。
--pretty 使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。


限制区间
--since, --after 仅显示指定时间之后的提交。
--until, --before 仅显示指定时间之前的提交。
--author 仅显示指定作者相关的提交。
--committer 仅显示指定提交者相关的提交。

3 推送和更新

3.1 push pull

git push <远程主机名> <本地分支名>:<远程分支名>
git pull <远程主机名> <远程分支名>:<本地分支名>
本地分支名省略,默认是当前分支,如果当前分支是关联分支(track),那么远程分支名也可以省略.

git push :<远程分支名> 推送空分支===删除远程分支 但是你不一定有权限

pull时容易出现冲突,最好pull前清空暂存区(commit或者stash),pull时会自动合并(与git设置有关,不过我的fast-forward是自动的)

3.2 push时的用户名密码

没有配置的话,每次都要输用户名密码

git config
设置信息(实际上不设置的话无法commit)
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com

长期存储用户名密码
git config --global credential.helper store
暂时缓存用户名密码
git config credential.helper cache
git config --global  credential.helper  'cache --timeout 3600'
git help credential-cache

注意: OSX会自动使用钥匙链机制,密码存储在那里面
git config --global credential.helper osxkeychain
更改的话进入钥匙串应用

--system  /etc/gitconfig文件
对系统上所有用户及他们所拥有的仓库都生效的配置值
--global  ~/.gitconfig
对当前用户生效

core.editor 改变commit时编辑器,默认vi
commit.template gaicommit时默认的信息文件

4 stash

在一个分支上的工作尚未完成,要调到别的分支或者pull时

  1. git stash
    备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。

不过最好使用git stash save -a "messeag"加上信息比较好

  1. git stash list 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。

  2. git stash clear 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。

  3. git stash pop:从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。
    git stash pop stash@{id}或者 git stash apply stash@{id}指定ID
    apply相比于pop:pop会删除git栈里的内容,apply不会

5 tag

  1. git tag查看标签
    git tag -l 'v1.4.2.*' 搜索标签

  2. git push origin [标签名] 推送标签
    git push origin --tags推送所有标签

  3. git tag -a v1.4 -m 'my version 1.4' 打标签
    -a (取 annotated 的首字母)
    git tag [标签名]打一个轻量标签

  4. git show v1.4
    查看某标签具体信息

  5. git tag -d [标签名]   删除本地
    git push origin :refs/tags/[标签名]删除远程

6 branch remote

平时一般用来查看分支和远程仓库信息
git branch 查看本地分支
git branch –r查看所有远程分支名
git branch -a查看所有分支(包括本地和远程)
git branch -vv查看分支详细,可以配合-r -a使用, v可以一个或两个,两个

git branch -b [分支名]创建分支
git branch -d [分支名]删除分支

git remote -v查看远程仓库信息
git remote add origin [地址] 添加一个名为origin的远程仓库
git remote show [远程仓库名] 可以检查远程仓库是否正确

7 Git使用remote搭建简单仓库

需求:代码在主机写的,但是可能在ubuntu虚拟机运行并且修改 但是想存储在mac上 不使用已有公共仓库(不一定有网) 可以使用git remote命令搭建个简单的仓库 方便转移代码

  1. 初始化远程仓库
    先在本机找好地方~/Codes/gitRepositories
    在这个目录下执行git init 

  2. 开启访问权限
    在远程仓库处
    git config receive.denyCurrentBranch warn否则后面push的时候可能提示说设置receive.denyCurrentBranch

机器需要开启SSH
mac开启SSH在System Preference -> Sharing -> Remote Login (checked) 设置下即可
3. 把你本地的项目push上去到远程仓库
你已经有一个git管理的项目了
git remote add origin ~/Codes/gitRepositories/test/.git注意目录因为在同一台机器上可以直接写本地目录
然后
git push origin --all
这里远程仓库搭建完成,实际上远程仓库在服务器也是可以的,地址使用ssh的地址
4. 虚拟机或其它机器拉取项目
先确认ssh能够登陆
ssh guwei@192.168.113.1
连接不上请检查配置:~/.ssh/ /etc/ssh/或者ssh -vvv调试

然后 clone项目
git clone ssh://guwei@192.168.113.1/~/Codes/gitRepositories/test/.git
然后 你可以两台机器测试下push等等

8 idea中的git

实际上,很多时候我都是在用idea里面的git.鼠标点击_
里面的show diff 和merge合并的时候,两个文件分别显示还是很不错了

然后就是有一个.ignore的插件可以装上

6N8%7D9.png)

posted on 2016-10-06 14:25  碧柳  阅读(686)  评论(0)    收藏  举报

导航