Git学习

Git学习

1、初始化git仓库

将一个目录变成Git可以管理的仓库 。

git init
2、添加指定文件到仓库
git add <file>
3、提交文件到仓库

提交文件到仓库,并写上本次提交备注。

git commit -m <message>
4、查看提交日志

查看提交日志,可以看到3次提交的日志,如果看的不清晰可以加上--pretty=oneline参数,想看合并图加上--graph参数。

git log
5、回退
1、回退版本

首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

回退上一个版本:

git reset --hard HEAD^

回退指定版本:【1094a 版本号的一部分,没必要写全,前几位就可以了,Git会自动去找 】。

git reset --hard 1094a
2、回退暂存区【git add之后】的到工作区
git reset HEAD <file> 
6、查看历史命令

查看历史命令,以便确定要回到未来的哪个版本 。

git reflog
7、查看当前状态
git status
8、对比区别

查看工作区和版本库里面最新版本的区别 。

git diff HEAD -- <file>
9、撤销

把文件在工作区的修改全部撤销,这里有两种情况:

一种是文件自修改后还没有被放到暂存区【git add之后】,现在,撤销修改就回到和版本库一模一样的状态。

一种是文件已经添加到暂存区后【git add之后】,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commitgit add时的状态。

git checkout -- <file>命令中的--很重要,没有--,就变成了切换到另一个分支的命令。

git checkout -- <file>
10、删除文件

如果手动将文件删除,然后使用git rm <file>git add<file>效果是一样的 【之前已经提交的】。

git rm

假如删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本。

git checkout -- <file>
11、添加远程仓库

现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份。

首先,登陆GitHub,然后在右上角找到Create a new repo按钮,创建一个新的仓库。

Repository name填入demo,其他保持默认设置。

点击Create repository按钮,就成功地创建了一个新的Git仓库。

git remote add origin https://github.com/ffxnh/demo.git

git push -u origin master 【第一次推送`master`分支的所有内容需要加`-u`,可能会让你输入`token`】

git push origin master 【此后,每次本地提交后,只要有必要,就可以使用命令推送最新修改】

Gitbub token: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,这个在右上角settings ---> Developer settings ---> Personal access tokens ---> New GitHub App

12、删除远程仓库

使用前,建议先用git remote -v查看远程库信息 。

git remote -v
origin  https://github.com/ffxnh/demo.git (fetch)
origin  https://github.com/ffxnh/demo.git (push)

根据名字删除git remote rm <name>,比如删除origin,

git remote rm origin

注意:此处的删除其实是解除了本地和远程的绑定关系,并不是物理上删除了远程库。远程库本身并没有任何改动。要真正删除远程库,需要登录到GitHub,在后台页面找到删除按钮再删除。

13、克隆远程仓库

https协议

git clone https://github.com/ffxnh/demo.git

git协议

git clone git@github.com:ffxnh/demo.git
14、创建与合并分支

我们创建dev分支,然后切换到dev分支,git checkout -b <name>git switch -b <name>

git checkout -b dev 【`git switch -b dev`】

git checkout命令加上-b参数表示创建并切换,相当于以下两条命令

git branch dev
git checkout dev 【`git switch dev`】

查看当前分支 , git branch命令会列出所有分支,当前分支前面会标一个*号。

git branch
* dev
  master

合并某分支到当前分支 git merge <name>

git merge dev
Updating b7e797b..78d5f19
Fast-forward
 test.txt | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快

删除分支git branch -d <name>,如果该分支没有被合并过,使用git branch -D <name>删除

git branch -d dev

注意:通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。

如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

git merge --no-ff -m "message" <name>

--no-ff参数,表示禁用Fast forward,因为生成一个新的commit所以写上信息

git merge --no-ff -m "merge with no-ff" dev
15、解决冲突
git merge feature1
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.
第一行
dev提交的
<<<<<<< HEAD
master提交的
=======
feature1提交的
>>>>>>> feature1

需要手动解决, Git<<<<<<<=======>>>>>>>标记出不同分支的内容,我们修改如下后,继续提交

第一行
dev提交的
master提交的
feature1提交的

执行git add <file>git commit - m "message"

git add test.txt

git commit -m "解决冲突"
16、解决BUG时,当前分支功能未完成,怎么办

Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作

git stash

接下来应该切换到master分支后,新建并切换一个修改BUG的分支, 修复完成后,切换到master分支,并完成合并,最后删除bug分支

接下来继续自己的工作,切换回工作分支,例如:

git switch dev

查看状态

git status

On branch dev
nothing to commit, working tree clean

发现是干净的, 刚才的工作现场存到哪去了,执行查看储藏命令

git stash list
stash@{0}: WIP on dev: f52c633 add merge

此时需要恢复一下,有两个办法

一种是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除。

一种是方式是用git stash pop,恢复的同时把stash内容也删了

你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,然后再删除

git stash apply stash@{0}

git stash drop stash@{0}

注意:在master分支上修复了BUG后,我们要想一想,dev分支是早期从master分支分出来的,所以,这个BUG其实在当前dev分支上也存在。

git cherry-pick命令的作用,就是将指定的提交【commit】应用于其他分支, 不一定是提交的哈希值,分支名也是可以的,随后会自动给当前分支做了一次提交 。

 git cherry-pick 4c805e2
17、多人远程协作

查看远程信息

git remote

origin

显示更详细的信息

git remote -v

origin  git@github.com:michaelliao/learngit.git (fetch)
origin  git@github.com:michaelliao/learngit.git (push)

从本地推送分支git push origin <branch-name>,如果推送失败,先用git pull拉取远程的最新提交

git push origin master

在本地创建和远程分支对应的分支【本地和远程分支的名称最好一致】

git checkout -b branch-name origin/branch-name

建立本地分支和远程分支的关联

git branch --set-upstream branch-name origin/branch-name

多人协作的工作模式通常是这样

首先,可以试图用git push origin branch-name推送自己的修改。

如果推送失败,则因为远程分支比你的本地更新,需要先用git pull拉去试图合并。

如果合并有冲突,则解决冲突,并在本地提交。

没有冲突或者解决掉冲突后,再用git push origin推送就能成功。

如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to origin/

18、标签管理

创建标签 git tag <name>

git tag v1.0

查看所有标签

git tag

v1.0

标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。

标签不是按时间顺序列出,而是按字母排序的。可以用git show查看标签信息

默认标签是打在最新提交的commit上的。有时候,如果忘了打标签 ,在打标签的时候带上commit id

git tag v0.9 f52c633

创建带有说明的标签 git tag -a <tagname> -m "blablabla..."s

git tag -a v0.1 -m "message" 1094adb

删除一个本地标签

git tag -d <tagname>

删除一个远程标签

git push origin :refs/tags/<tagname>

推送一个本地标签

git push origin <tagname>

推送全部未推送过的本地标签

git push origin --tags
19、忽略文件

在仓库目录下新建忽略文件.gitignore

GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了,gitignore配置

想添加一个文件到Git,但发现添加不了,原因是这个文件被.gitignore忽略了,这个时候你可以强制提交

git add -f App.class

或者你发现,可能是.gitignore写得有问题,需要找出来到底哪个规则写错了,可以用git check-ignore命令检查

git check-ignore -v App.class

.gitignore:3:*.class    App.class 【`.gitignore`的第`3`行规则忽略了该文件,】

如果想把指定文件排除在.gitignore规则外,用!

# 排除所有.开头的隐藏文件:
.*
# 排除所有.class文件:
*.class

# 不排除.gitignore和App.class:
!.gitignore
!App.class
20、配置别名

--global参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用

例如

git config --global alias.st status
git config --global alias.ci commit

git config --global alias.unstage 'reset HEAD'
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

以后就可以写成

git st
git ci -m "message"

git unstage test.txt
git lg

配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。

每个仓库的Git配置文件都放在.git/config文件中

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = true
[remote "origin"]
    url = git@github.com:michaelliao/learngit.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[alias]
    last = log -1

别名就在[alias]后面,要删除别名,直接把对应的行删掉即可。

而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig

[alias]
    co = checkout
    ci = commit
    br = branch
    st = status
[user]
    name = Your Name
    email = your@email.com
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 引用 感谢廖海峰老师的精彩文章文章出处https://www.liaoxuefeng.com/wiki/89604...
    学习ing兰阅读 232评论 0 0
  • 安装Git Git的下载地址:Git官网下载地址 Git本地仓库和命令 配置用户 下载完Git后,右键会有一个Gi...
    TokyoZ阅读 4,540评论 1 7
  • 这篇博文是自己在学习git过程中的思考总结。本文仅仅代表个人的看法,如有不妥地方还请本文文末留言。 😊 原文链接g...
    Ming_Hu阅读 1,152评论 4 18
  • 安装: windows安装git-- msysgit是windows版的git,下载单独的.exe按照默认选项安装...
    alceyp阅读 713评论 0 0
  • pro gitGit教程 Git是目前世界上最先进的分布式版本控制系统(没有之一)Linus在1991年创建了开源...
    凯玲之恋阅读 505评论 0 0