Fork me on GitHub

git常用语句

1.安装git,也适用于升级

yum -y install gcc zlib-devel openssl-devel curl-devel \
expat-devel gettext-devel perl-ExtUtils-MakeMaker
mkdir -p /server/tools
cd /server/tools
wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.7.4.tar.gz
tar xf git-2.7.4.tar.gz
cd git-2.7.4/
make prefix=/usr/local/git all
make prefix=/usr/local/git install
rm -rf /usr/bin/git
ln -s /usr/local/git/bin/git /usr/bin/git
git --version

2.使用git

工作区:就是在你的电脑里能看到的目录,比如创建的test;

版本库:工作区中有一个隐藏目录.git,它不算工作区,而是git的版本库,git的版本库里面存放了很多的东西,其中最重要的就是称为stage的暂存区,有git为我们自动创建的第一个分支master,以及指向master的一个指针叫head.

mkdir test
git init
git config --global user.name "lixiang"
git config --global user.email "1746465163@qq.com"
git config --list

在test目录中创建一个文件,此时文件的状态是Untracked(未被追踪);

git add之后,文件被放到暂存区,状态变为Staged(已暂存);

git commit,文件被放到本地仓库,状态变为Unmodified(未被修改);

编辑了这个文件后,它会从本地仓库被拉取到工作目录,状态变为Modified(被修改了).

echo "This is your First Page" > index.html
git status
Untracked files
git add index.html
git commit -m "first commit"
# git rm --cached <file>演示
echo "pay module" > pay.html
echo "new center" > news.html
git add news.html pay.html
# 此时发现pay.html还没开发完,不想commit这个文件了,就需要在暂存区将其删除
git rm --cached pay.html

3.分支管理

git status
On branch master
git branch about    # 会在当前所在的提交对象上创建一个指针
git checkout about  # Switched to branch 'about' 切换到分支about
echo "about" > about.html
git branch  # 查看自己当前所在的分支
git add .
git commit -m "about's index.html"
echo 'second page' > second.html
git add .
git commit -m "second page"
git checkout master  # 此时master上有两次提交,about上有四次提交
git merge about      # 在master上融合分支about
git branch --merged  # 查看已融合的分支
git branch --no-merged # 查看未融合的分支

4.reset

echo "this is second line" >> index.html
echo "qwer" >> news.html
git add news.html
git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   news.html

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   index.html

查看日志

git log
commit 1ed03656c29f2742314f054c8aba8705c52016d5
Author: lixiang <1746465163@qq.com>
Date:   Wed Dec 26 22:06:06 2018 +0800

    second page

commit 0e8f8c5878734792e9a94cc435cbeb7b4cd7b369
Author: lixiang <1746465163@qq.com>
Date:   Wed Dec 26 22:03:11 2018 +0800

    about's index.html

commit ab0e299c14f1357df828647a1b0476f829a2815a
Author: lixiang <1746465163@qq.com>
Date:   Wed Dec 26 20:37:51 2018 +0800

    commit news

commit 672cc2a692754391725d7179d4d217a552e666a8
Author: lixiang <1746465163@qq.com>
Date:   Wed Dec 26 20:29:47 2018 +0800

    first commit

git reset --hard HEAD~1
HEAD is now at 0e8f8c5 about's index.html
ls
about.html  index.html  news.html

--soft:缓存区和工作目录都不会被改变(只回撤本地版本库)

--mixed:默认选项.缓存区和你指定的提交同步,但工作目录不受影响(回撤本地版本库和缓存区)

--hard:缓存区和工作目录都同步到你指定的提交(回撤本地版本库、缓存区和工作目录)

git reset --hard 1ed03656  # 回到第四次提交
# 如果嫌输出的信息太多,可以使用--pretty=oneline
git log --pretty=oneline
ls
about.html  index.html  news.html  second.html
git diff HEAD -- filename可以查看工作区和版本库里面最新版本的区别

5.checkout和reflog

git reflog:把之前的ID都显示出来	
	
0e8f8c5 HEAD@{0}: reset: moving to HEAD~1
1ed0365 HEAD@{1}: reset: moving to 1ed03656
0e8f8c5 HEAD@{2}: reset: moving to HEAD~1
1ed0365 HEAD@{3}: merge about: Fast-forward
ab0e299 HEAD@{4}: checkout: moving from about to master
1ed0365 HEAD@{5}: commit: second page
0e8f8c5 HEAD@{6}: checkout: moving from master to about
ab0e299 HEAD@{7}: checkout: moving from about to master
0e8f8c5 HEAD@{8}: checkout: moving from about to about
0e8f8c5 HEAD@{9}: commit: about's index.html
ab0e299 HEAD@{10}: checkout: moving from master to about
ab0e299 HEAD@{11}: commit: commit news
672cc2a HEAD@{12}: commit (initial): first commit	
	
git checkout  1ed0365	
git status	
HEAD detached at 1ed0365
nothing to commit, working directory clean	
# 此时用git log查看,有四次提交,但创建一个新分支-reset,切换到reset,
# 再切回master,发现status显示正常,但log只有三次,说明master没有真正回到第四次
git branch reset
git checkout reset
git checkout master
git merge reset
# 我觉得是checkout的问题,用reflog查出id,再用reset回滚应该也行
git reset --hard 1ed0365

git checkout有两个作用:在分支级别,是将指针切换到不同的提交对象;

git checkout -- filename:在文件级别,是撤销对文件的修改.

a.修改后还没有被放到暂存区,撤销修改就回到和版本库一模一样的状态;

b.已经添加到暂存区后,又作了修改,撤销修改就回到添加到暂存区后的状态.

原理:用版本库里的版本覆盖被修改的文件.

假如将文件提交到了暂存区,use "git reset HEAD <file>..." to unstage,用reset撤销缓存区的变更;

假如将文件commit到了本地版本库,可以用reset回滚;

假如将本地版本库推送到了远程版本库,可以推送一个符合你想要的标准的文件,一步步到最后,覆盖那个远程版本库上错误的文件.

6.删除文件

先创建文件,后add,再commit,然后删除工作区的文件
git add test.txt
git commit -m "del test"
rm -rf test.txt
现在你有两个选择:一是确实要从版本库中删除该文件,那就用删掉,并且git commit
git rm test.txt
git commit -m "remove test.txt"
如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,
你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容.
另一种情况是删错了,因为版本库里还有呢,可以把误删的文件恢复到最新版本:
git checkout -- test.txt
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以"一键还原".

7.标签管理

git tag -a v1.0 -m "version1.0 released"
git tag -d v1.0
# 如果要推送某个标签到远程
git push origin v1.0
# 一次性推送全部尚未推送到远程的本地标签
git push origin --tags
# 如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除,然后,从远程删除
git tag -d v0.9
git push origin :refs/tags/v0.9

 

参考博客:https://www.cnblogs.com/kevingrace/p/5569728.html

posted @ 2019-01-28 17:53  法外狂徒  阅读(368)  评论(0编辑  收藏  举报