git 笔记记录

时间:2023-12-19 12:25:32

分布式版本控制系统Git 是一套内容寻址文件系统,从核心上来看不过是简单地存储键值对。
一: git 本地clone 一个仓库
    1. 直接clone一个仓库:
        $: git clone https://github.com/lmh2072005/gitStudy.git
    2. 另外一种clone方式:
        # 创建目录初始化本地仓库
        $: mkdir gitStudy && cd gitStudy
        $: git init

如果不是全局的用户,配置本地仓库用户信息
        git config usr.name xxx
        git config user.email xxx

# 添加远程仓库路径(git里,服务器上的仓库在本地称之为remote)
        $: git remote add github https://github.com/lmh2072005/gitStudy.git
        从远程pull(fetch + merge)
        $: git pull github [branch name]

把工作目录迁移到github上面:
        $: git push github --all

git remote 参数明细,查看远程库的信息
        git remote add name url 在url创建名字为name的映射(Adds a remote named <name> for the repository at <url>)
        git remote show name 给出remote name的信息。
        git remote -v | --verbose 列出remote详细信息
        git remote 不带参数,列出已经存在的远程分支,例如:
        #git remote
         github

二:git branch

git branch 不带参数 列出本地已经存在的分支
    git branch -r 列出远程分支
    git branch -a 列出本地分支和远程分支
    git branch xxx 创建一个新的本地分支xxx
    git branch -m | -M oldbranch newbranch 重命名分支,如果newbranch名字分支已经存在,则需要使用-M强制重命名,否则,使用-m进行重命名。
    git branch -d | -D branchname 删除branchname分支
    git branch -d -r branchname 删除远程branchname分支

创建并切换到当前分支:git checkout -b branchname
 
    只要local有改动,没有提交,都不能切换branch

git branch --merged 查看哪些分支已被并入当前分支
   git branch --no-merged 查看尚未合并的工作
   git branch -v 查看各个分支最后一个提交对象的信息
 
三:git stash

git stash 将当前分支的所有改动剪切保存起来, 只用于暂存区改动,如果已经提交到本地仓库可以回退历史git reset --soft HEAD^ 回到暂存区再stash,

git stash apply 将保存起来的所有的改动应用到当前分支
 
   git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除
   另一种方式是用git stash pop,恢复的同时把stash内容也删了
   git stash list  查看所有的stash

取消储藏 在某些情况下,你可能想应用储藏的修改,在进行了一些其他的修改后,又要取消之前所应用储藏的修改
  git stash show -p stash@{0} | git apply -R
  如果你沒有指定具体的某个储藏,Git 会选择最近的储藏
  git stash show -p | git apply -R
  新建一个別名,在你的 Git 里增加一个 stash-unapply 命令,这样更有效率
  git config --global alias.stash-unapply '!git stash show -p | git apply -R'

四:git diff

查看具体修改了什么内容 ,工作区和版本控制区的比较
git diff HEAD --filename”命令可以查看工作区和版本库里面最新版本的区别
git diff --check,会把可能的多余白字符修正列出来
git diff HEAD   显示工作区和HEAD的区别。
git diff A B  显示A和B的区别,A和B可以是标签、分支、commit等。
git difftool -y HEAD^..HEAD  应用比较工具比较上一个版本和当前版本的区别

git diff HEAD^..HEAD  比较上一个版本和当前版本的区别

五:git log

git log  查看提交的历史记录

git log --pretty=oneline   查看简单的历史记录

用带参数的git log也可以看到分支的合并情况,生成类似分支树形图
$ git log --graph --pretty=oneline --abbrev-commit

Git提供了一个命令git reflog用来记录你的每一次命令

六:git reset

回退到历史版本
git reset --hard HEAD^
用HEAD表示当前版本
上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
git reset --hard fe8e15651  回退到具体提交的记录

用命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区.
再用git checkout --file 撤销工作区的修改
如果已经提交到了版本库就只能回退历史版本了git reset --hard HEAD^

git reset --soft    
--soft:index和working directory中的内容不作任何改变,仅仅把HEAD指向<commit> ,则位于HEAD后面的<commit>处于准备提交的状态。

相当于分支上移动HEAD,通常用于减少提交记录 。(比如commit了100次,当HEAD移动到第一次提交记录时再push,这个时候历史记录只会有1次提交历史)

七:工作区(Working Directory)版本库(Repository)

工作区就是你在电脑里能看到的目录
工作区有一个隐藏目录“.git”,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用“git add”把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用“git commit”提交更改,实际上就是把暂存区的所有内容提交到当前分支.

八:git checkout

git checkout branch 切换分支
git checkout -- file可以丢弃工作区的修改  eg:git checkout -- a.txt
git checkout -b branch  创建分支并切换到该分支

九:git count-objects -v

git count-objects -v 以查看项目使用了多少空间

十:git rm

删除文件 git rm file

十一:git merge

git merge命令用于合并指定分支到当前分支
比如当前所在分支为master, git merge dev 表示合并dev到当前master分支

合并分支时,如果可能,Git会用“Fast forward”模式,但这种模式下,删除分支后,会丢掉分支信息
如果要强制禁用“Fast forward”模式,Git就会在merge时生成一个新的commit
git merge --no-ff -m "merge with no-ff" dev
将dev 合并到当前分支 ,--no-ff参数,表示禁用“Fast forward”

十二:git pull

从远程服务端更新到本地仓库
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,
用命令git branch --set-upstream branch-name origin/branch-name

十三:git push

将本地仓库的提交推送到远程
推送时,如果指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
git push origin master  将本地master推送到远程origin

十四:git tag

标签是版本库的一个快照 ,是指向某个commit的指针,一个别名,为了更方便的查看管理。
git tag name用于新建一个标签,默认为HEAD,也可以指定一个commit id
git tag查看所有标签
git tag name commitid   为过去的提交打标签
eg: git tag v0.1 23fsdfa

git show tagname查看标签信息
还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:
git tag -a v0.1 -m "version 0.1 released" 3628164

git tag -d tagName  删除tag
创建的标签都只存储在本地,不会自动推送到远程,如果要推送某个标签到远程,使用命令git push origin tagname
一次性推送全部尚未推送到远程的本地标签: git push origin --tags

如果标签已经推送到远程,要删除远程标签,先从本地删除
git tag -d v0.9
然后,从远程删除,删除命令也是push:   git push origin :refs/tags/v0.9

十五:git remote

git checkout -b [分支名] [远程名]/[分支名]
eg:  git checkout -b serverfix origin/serverfix   
切换到新建的 serverfix 本地分支,其内容同远程分支 origin/serverfix 一致

git push [远程名] :[分支名]  删除远程分支
git push origin :serverfix 在服务器上删除 serverfix 分支

十六:gir rebase

git rebase衍合
比如将a分支合并到master ,采用merge :
git checkout master 、 git merge a  
如果master分支还有新的提交 ,则a分支的提交会和master的提交合并为一个新的提交记录
采用rebase :
git checkout a、 git rebase master
会将a分支的更改生成一个对应的快照放在master后面,看起来所有修改都是在一根线上先后进行的尽管实际上它们原本是同时并行发生的
两种合并结果一样 ,只是历史记录不一样

十七:git filter-branch

如果你想用脚本的方式修改大量的提交,还有一个重写历史的选项可以用
要从整个历史中删除一个名叫password.txt的文件
git filter-branch --tree-filter 'rm -f passwords.txt' HEAD

十八:git blame  文件标注

如果你发现自己代码中的一个方法存在缺陷,你可以用git blame来标注文件,查看那个方法的每一行分别是由谁在哪一天修改的。
下面这个例子使用了-L选项来限制输出范围在第12至22行:
git blame -L 12,22 simplegit.rb
git blame后加上-C,Git会分析你在标注的文件然后尝试找出其中代码片段的原始出处,比如从其它文件剪切过来的
git blame -C -L 12,22 simplegit.rb

十九:Git属性 .gitattributes

比如二进制文件版本管理在比较时无法区分 ,可以在.gitattributes文件中设置相关属性
.gitattributes文件通常是你项目的根目录
对Word文档进行版本控制,word文档为二进制文档不能直接比较两个不同版本的Word文件
Git 属性能很好地解决此问题,把下面的行加到.gitattributes文件:
*.doc diff=word
其实就是 Git 使用strings 程序,把Word文档转换成可读的文本文件
再配置个git config diff.word.textconv catdoc
现在如果在两个快照之间比较以.doc结尾的文件,Git 对这些文件运用"word"过滤器,在比较前把Word文件转换成文本文件
比较图片在.gitattributes文件加:*.png diff=exif,配置git config diff.exif.textconv exiftool  (如果你下载并安装了exiftool程序)

二十:配置

在Git工作区的根目录下创建一个特殊的.gitignore文件然后把要忽略的文件名填进去,Git就会自动忽略这些文件
在文本编辑器里“保存”或者“另存为”就可以把文件保存为.gitignore了, windows下打开cmd输入 copy > .gitignore 在当前目录生成.gitignore文件
比如过滤内容:
# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini

配置别名
告诉Git,以后st就表示status
git config --global alias.st status
现在敲git st 就相当于git status
eg:git config --global alias.unstage 'reset HEAD'

git config commit.template 当运行git commit时, Git 会在你的编辑器中显示设置的内容
eg : git config --global commit.template $HOME/.gitmessage.txt

git config core.autocrlf  配置处理在windows操作系统和其它操作系统结束符问题

在过滤.idea文件夹时发现没发过滤,原来是之前已经加入git版本了 ,

所以要先清理下缓存  git rm -r --cached .idea

再在.gitignore里面加入/.idea/

参考:http://*.com/questions/9550437/how-to-make-git-ignore-idea-files-created-by-rubymine

二十一:git-cherry-pick

Apply the changes introduced by some existing commits

Given one or more existing commits, apply the change each one
introduces, recording a new commit for each.  This requires your
working tree to be clean (no modifications from the HEAD commit).

可以将已存在的提交应用到当前分支,git cherry-pick commitid

eg:  git cherry-pick 3f3a085

二十二:git commit --amend

修改提交的注释

参考资料:

http://git-scm.com/book/zh/
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
其它网上资料

更多学习资料:

https://www.atlassian.com/git/workflows#!workflow-overview
http://ihower.tw/blog/archives/5140
http://www.worldhello.net/gotgithub/04-work-with-others/010-fork-and-pull.html
http://rogerdudler.github.io/git-guide/index.zh.html
http://www.ibm.com/developerworks/cn/opensource/os-cn-tourofgit/
http://scottchacon.com/2011/08/31/github-flow.html
http://nvie.com/posts/a-successful-git-branching-model/
http://blog.csdn.net/hudashi/article/details/7664464

整理:

1 教程 Git简易教程 点击查看 比较简单,提供概览。
2 教程 开源分布式版本控制工具 —— Git 之旅 点击查看 比较详细的一个教程。
3 开发流程 GitHub Flow 点击查看 GitHub官方流程,适合自动化程度比较高的团队。
4 开发流程 A successful Git branching model 点击查看 适应性比较广的流程,适合从传统流程迁移过来的团队。
5 开发流程 Git flow 開發流程 点击查看 4的中文解说。
6 Pro Git

点击查看
PDF

官方推荐的免费书籍,难度适中,强烈推荐阅读