GIT使用

git是什么

git基本原理详解
git内部原理(有点难懂)

git是一个分布式的软件管理器,不仅有一个中心的服务器控制最新版本代码,而且每个开发者自己还有个本地仓库,所以在开发过程中都是先将代码提交到本地仓库再推送到中心服务器上的,这样的好处就是每个人都依赖于中心服务器来实现交互,但又不会被中心服务器限制,就算中心服务器挂了,也能很容易的找到最新版本的代码,而且我自己的工作依然可以顺利进行,提交到本地仓库,当中心服务器修复之后,再将自己仓库的东西推送到中心服务器。

执行git init命令,就会创建并初始化git仓库,这个时候在该目录下会产生一个.git的隐藏文件夹,而该目录就是你的工作目录,你的一切行为都是在这个目录里,而这个.git文件夹就是你的本地仓库,当你进行了一些文件操作之后,认为可以提交了那么首先你就是提交到本地仓库也就是这个.git中,然后再推送到中心服务器。

git所存储的都是一系列的文件快照,然后git来跟踪这些文件快照,发现哪个文件快照有变化它就会提示你需要添加到暂存区或是提交到本地仓库来保证你的工作目录是干净的。

git 教程

GIT使用_第1张图片

创建仓库命令

命令 说明
git init 初始化仓库
git clone 拷贝一份远程仓库,也就是下载一个项目。


GIT使用_第2张图片
init一个仓库的命令,有很多命令不是必须的

.gitignore中放置忽略的东西,即不需要追踪的文件。

提交与修改

Git 的工作就是创建和保存你的项目的快照及与之后的快照进行对比。
下表列出了有关创建与提交你的项目的快照的命令:

命令 说明
git add 添加文件到仓库
git status 查看仓库当前的状态,显示有变更的文件

git status -s

git diff 比较文件的不同,即暂存区和工作区的差异。
git commit 提交暂存区到本地仓库。-m [message]

如果要在提交的代码上进行继续修改,那么步骤:

  • git commit --amend
  • git push origin HEAD:refs/for/xxx
修改commit提交的信息
1、git log --oneline -5

    查看最近5次commit的简要信息,输出信息为:简短commitID commit_message,可以根据需要查看最近n次的提交

    也可以git log -5,输出信息相对详细些,commitID为完整的,这里只需要加上参数--oneline查看简短commitID即可

2、git rebase -i <简短commitID>

    如果需要修改从上往下第2个commit_message,这里的简短commitID为上面输出信息的第3个,以此类推

    在弹出的窗口中,以VIM编辑方式显示了最近两次的提交信息

3、(按照VIM操作)按i键,进入编辑模式,将想要修改的提交前的pick改为reword,如果需要修改多个,也可以将对应的多个pick改为reword

4、(按照VIM操作)按ESC键        再按 shift + :        然后输入wq(w是保存,q是退出)        按回车键

5、在弹出的窗口中,按i进入编辑模式,就可以修改commit_message了

6、(按照VIM操作)按ESC键        再按 shift + :        然后输入wq(w是保存,q是退出)        按回车键(同第4步)

    如果第3步中修改了多个pick为reword,则会多次弹出修改界面,重复第5~6步即可

7、再使用第1步的命令查看一下修改结果,git log --oneline -5或者git log -5,查看修改是否已经完成

8、最后强制push上去git push --force
-------------------------------------------------------------------------------------------------------
快捷操作:

1,修改最近一次的commit 信息

  git commit --amend

  然后就会进入vim编辑模式

2,比如要修改的commit是倒数第三条,使用下述命令:

  git rebase -i HEAD~3
3, 退出保存 :wq
4,执行 git rebase --continue
5,执行 git push -f 推送到服务端

git reset 回退版本。

git reset 命令用于回退版本,可以指定退回某一次提交的版本。
有没有--hard的区别:
git reset HEAD操作只对暂存区起效果,不对工作区的内容起效果。
有了参数--hard,直接把工作区的内容也修改了

git reset --hard (commit 序列号)

我用git reset HEAD^发现一些提交的信息没有了,这个是返回到上一次版本。

git reflog    git reflog 可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)
git reset --hard 2780417(git reflog 前面出现的号码)
  • 下面是我在其他博客中看到的内容,我尝试了一下最后一个merge步骤出现了错误,还未解决何种原因。
    如果用--hard把工作区内容不小心删除了,那么一般来说文件是找不到的,但是可以用下面的命令来使用:(如果没有加入追踪区,那么就不能找回了)
    1、使用git fsck --lost-found命令查找未提交而被删除的记录
    2、使用git show+数字(查找的删除记录编号),确认需要恢复的内容
    3、使用git merge+数字(查找的删除记录编号),合并被删除的记录
    但是:git fsck --lost-foun可以查到丢失的。如果项目有段时间了会找到了几百上千多条记录。要在这么多记录中找到刚才丢失的数据是不容易的。所以此法可能比较难。

如果想从版本中回复一个文件的数据,可以用

git checkout (commit 序列号) filename
git reset 命令语法格式如下:
git reset [--soft | --mixed | --hard] [HEAD]
----------------------------------------------------------------------
--mixed 为默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。
git reset  [HEAD] 
实例:
$ git reset HEAD^            # 回退所有内容到上一个版本  
$ git reset HEAD^ hello.php  # 回退 hello.php 文件的版本到上一个版本  
$ git  reset  052e           # 回退到指定版本
----------------------------------------------------------------------
--soft 参数用于回退到某个版本:
实例:

$ git reset --soft HEAD~3 # 回退上上上一个版本
----------------------------------------------------------------------
--hard 参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交:

git reset --hard HEAD
实例:

$ git reset –hard HEAD~3  # 回退上上上一个版本  
$ git reset –hard bae128  # 回退到某个版本回退点之前的所有信息。 
$ git reset --hard origin/master    # 将本地的状态回退到和远程的一样

git rm 删除工作区文件。
git mv 移动或重命名工作区文件。

使用soft:修改 本地多个提交,与库上代码同步

把记录用git reset --sfot回退一下

然后重新提交一条commit

然后git branch新建一个当前分支最备份

然后回退你的分支到较早的提交(库里已经有的)

然后同步

同步完后,git cherry-pick备份分支你里想要提交的那次commit的commit id就可以了

然后再提交,就ok了

日志

命令 说明
git log 查看历史提交记录.
git blame 如果要查看指定文件的修改记录可以使用 git blame 命令

git log --oneline 简洁的查看commit,不显示文件。
git log --name-status 每次修改的文件列表, 显示状态(M:修改,A:新增)
git log --name-only 每次修改的文件列表
git log id(从那一次开始看,省略就是最新) --stat -num(显示几个)每次修改的文件列表, 及文件修改的统计
git log --decorate [= short | full | auto | no]
打印显示的所有提交的引用名称。
git whatchanged 每次修改的文件列表
git whatchanged --stat 每次修改的文件列表, 及文件修改的统计
git show 显示最后一次的文件改变的具体内容

远程操作

命令 说明
git remote 远程仓库操作
git fetch 从远程获取代码库
git pull 下载远程代码并合并
git push 上传远程代码并合并
git push origin HEAD:refs/for/xxx

Git 分支管理

查看远程库:对于repo,需要先进入:.repo/manifests
查看分支可以配置grep使用。
创建分支:git branch (branchname)
查看分支:git branch
查看远程分支:git branch -r
查看所有分支:git branch -a
切换分支命令: git checkout (branchname)
当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。
合并分支命令: git merge

合并前要先切回要并入的分支
以下表示要把一个branchName分支合并入master分支

$: git checkout master
$: git merge branchName
Merge made by recursive.
 README |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

删除分支: git branch -d (branchname)

分支不同步的时的merge

GIT使用_第3张图片

从图中可以看出,在c3步骤时创建了分支test,进行了c4和c5步骤,此时test指向c5;但是,此时master分支上又进行另外的开发,提交了两个版本c6和c7,那么此时的master和HEAD指针都指向的是c7,(在哪个分支上开发,那么HEAD就指向的是哪个分支上的commit),这个时候合并两个分支的话,就如下。

GIT使用_第4张图片

如图五,我们先切换到master分支,然后通过git merge test将test分支合并到master分支,这个时候,git就不是简单的移动指针了,因为两边都有开发,所以git就要对于两个分支的最新提交c5和c7还有两个分支共同的祖先commit对象c3来进行一次简单的三方合并,产生新的文件快照并用新的commit对象c8记录,这个合并的过程不需要太在意,如果产生了冲突,也就是两个分支对同一个文件进行了修改,那么git就会停下合并操作,让你处理好冲突后,再提交(c8),然后再进行合并。这时master和HEAD都指向c8,但是test是没有移动的,此时还可以在test上继续开发,再合并到master,如果test已经没有利用价值了就可以删掉了。

git show

git show [options]
不加参数时,直接显示最近一次的提交。
以下是一些示例 -
1.显示标签v1.0.0,以及标签指向的对象
$ git show v1.0.0
2.显示标签v1.0.0指向的树
$ git show v1.0.0^{tree}
3.显示标签v1.0.0指向的提交的主题
$ git show -s --format=%s v1.0.0^{commit}
4.显示 Documentation/README 文件的内容,它们是 next 分支的第10次最后一次提交的内容
$ git show next~10:Documentation/README
5.将Makefile的内容连接到分支主控的头部
$ git show master:Makefile

  1. 查看某次提交中的某个文件变化 git show commit-id filename

打标签

给最新一次提交打上(HEAD)"v1.0"的标签。如:git tag -a v1.0 -m "V1.0"
补打标签:git tag -a v1.0 (commit 序列):

切换tag:git checkout [tagname] //与切换分支命令相同
查看标签:git tag v1.0 或git tag -l ‘v0.1.*’ //搜索符合模式的标签
删除标签:git tag -d v1.0

-a 选项意为"创建一个带注解的标签"。 不用 -a 选项也可以执行的,但它不会记录这标签是啥时候打的,谁打的,也不会让你添加个标签的注解。

远程仓库操作

  1. 添加远程库
    git remote add [shortname] [url]

由于你的本地 Git 仓库和 GitHub 仓库之间的传输是通过SSH加密的,所以我们需要配置验证信息:
使用以下命令生成 SSH Key:
$ ssh-keygen -t rsa -C "[email protected]"

查看当前的远程库

要查看当前配置有哪些远程仓库,可以用命令:git remote

提取远程仓库

1、从远程仓库下载新分支与数据:git fetch
该命令执行完后需要执行 git merge 远程分支到你所在的分支。

2、从远端仓库提取数据并尝试合并到当前分支:git merge

推送到远程仓库

推送你的新分支与数据到某个远端仓库命令: git push [alias] [branch]
以上命令将你的 [branch] 分支推送成为 [alias] 远程仓库上的 [branch] 分支。

举例:
$ touch runoob-test.txt      # 添加文件
$ git add runoob-test.txt 
$ git commit -m "添加到远程"
master 69e702d] 添加到远程
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 runoob-test.txt
$ git push origin master    # 推送到 Github

删除远程仓库

git remote rm [别名]

你可能感兴趣的:(GIT使用)