Post

Git Tutorial

Git Tutorial

问题:找不到head指向

解决方法:git clone时提示warning: remote HEAD refers to nonexistent ref, unable to checkout

时光穿梭机

查看历史记录

1
$ git log

Example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
xw@xw:~/learngit$ git log
commit a85135e23b8b85be45aa028be1467ba72aeee977 (HEAD -> master)
Author: liubin <xiao_wu0413@163.com>
Date:   Tue Oct 24 20:44:24 2023 +0800

    append GPL

commit 7c1c517f867be3788dc6f5e22d0d9f7670ed4656
Author: liubin <xiao_wu0413@163.com>
Date:   Tue Oct 24 20:41:08 2023 +0800

    add distributed

commit 753dd632038dccfdea15561ceea5399852430482
Author: liubin <xiao_wu0413@163.com>
Date:   Tue Oct 24 20:36:43 2023 +0800

    write a readme file

显示从最近到最远的提交日志,若输出信息太多,可加上 –pretty=oneline 参数:

1
$ git log --pretty=oneline

Example:

1
2
3
4
xw@xw:~/learngit$ git log --pretty=oneline
a85135e23b8b85be45aa028be1467ba72aeee977 (HEAD -> master) append GPL
7c1c517f867be3788dc6f5e22d0d9f7670ed4656 add distributed
753dd632038dccfdea15561ceea5399852430482 write a readme file

回退

1
$ git reset --hard HEAD^

HEAD^ 表示上一个版本,HEAD表示当前版本,HEAD^^ 表示上上一个版本,HEAD^100表示往前100个版本

Example:

1
2
xw@xw:~/learngit$ git reset --hard HEAD^
HEAD is now at 7c1c517 add distributed

回退之后反悔

方法一:

需要记得要恢复版本的版本号,如append GPL的commit id 是a85315e23…

1
2
xw@xw:~/learngit$ git reset --hard a85135e23b8b85be45aa028be1467ba72aeee977
HEAD is now at a85135e append GPL

方法二:

若不记得相应的版本号,可通过指令 git reflog 找到版本号

1
$ git reflog

Example:

1
2
3
4
5
6
xw@xw:~/learngit$ git reflog
a85135e (HEAD -> master) HEAD@{0}: reset: moving to a85135e23b8b85be45aa028be1467ba72aeee977
7c1c517 HEAD@{1}: reset: moving to HEAD^
a85135e (HEAD -> master) HEAD@{2}: commit: append GPL
7c1c517 HEAD@{3}: commit: add distributed
753dd63 HEAD@{4}: commit (initial): write a readme file

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

命令:git diff HEAD – filename

Example:

1
2
3
4
5
6
7
8
9
10
11
xw@xw:~/learngit$ git diff HEAD -- readme.txt
diff --git a/readme.txt b/readme.txt
index 76d770f..a9c5755 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,4 +1,4 @@
 Git is a distributed version control system.
 Git is free software distributed under the GPL.
 Git has a mutable index called stage.
-Git tracks changes.
+Git tracks changes of files.

撤销修改

git checkout – file可以丢弃工作区的修改

Example:

1
$ git checkout -- readme.txt

命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

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

git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区

删除文件

若在电脑中将文件删除了,并且要把版本库里的相应文件也删掉,可以用指令git rm删掉,并且再用git commit

Example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
xw@xw:~/learngit$ ls
LICENSE.txt  readme.txt
xw@xw:~/learngit$ rm readme.txt 
xw@xw:~/learngit$ ls
LICENSE.txt
xw@xw:~/learngit$ git status 
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	deleted:    readme.txt

no changes added to commit (use "git add" and/or "git commit -a")
xw@xw:~/learngit$ git rm readme.txt 
rm 'readme.txt'
xw@xw:~/learngit$ git commit -m "delete readme.txt"
[master 9ebf4c7] delete readme.txt
 1 file changed, 5 deletions(-)
 delete mode 100644 readme.txt

若是删错了,想在版本库中恢复,可以用前面的git checkout -- filename

注意:若一个文件从未添加到过版本库,那删除之后是无法恢复的。

删除远程仓库中的文件:将仓库clone下来,然后在本地将目标文件删除,然后在comit和push回去

1
2
3
4
5
6
git clone 仓库地址
git add .
step1: git rm 文件 //本地中该文件会被删除
step2: git rm -r 文件夹 //删除文件夹
step3: git commit -m '删除某个文件'
step4: git push (origin master)

远程仓库

创建SSH Key

用户主文件夹中是否有一个.ssh文件夹,若有则已创建ssh key,反之则没有。可以通过命令ssh-keygen -t rsa -C "youremail@example.com"创建ssh key,其中输完命令一路回车即可,可以不需要设置密码。

然后登录Github,在setting中找到以下界面,添加即可。Github可以添加多个key。

ssh key

添加远程库

首先在Github上创建一个仓库,目前,在GitHub上的这个learngit仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。现在,我们根据GitHub的提示,在本地的仓库下运行命令:

1
git remote add origin git@github.com:用户名/Github仓库名.git
添加后,远程库的名字就是 origin ,这是Git默认的叫法,也可以改成别的,但是 origin 这个名字一看就知道是远程库。下一步,就可以把本地库的所有内容推送到远程库上:
1
git push -u origin master

Example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
xw@xw:~/learngit$ git remote add origin git@github.com:xiaowu003/learngit.git
xw@xw:~/learngit$ git push -u origin master
The authenticity of host 'github.com (140.82.113.3)' can't be established.
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'github.com' (ED25519) to the list of known hosts.
Enumerating objects: 24, done.
Counting objects: 100% (24/24), done.
Delta compression using up to 4 threads
Compressing objects: 100% (19/19), done.
Writing objects: 100% (24/24), 2.00 KiB | 1022.00 KiB/s, done.
Total 24 (delta 5), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (5/5), done.
To github.com:xiaowu003/learngit.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
把本地库的内容推送到远程,用

<font style="color:rgb(51, 51, 51);background-color:rgb(250, 250, 250);">git push</font>命令,实际上是把当前分支<font style="color:rgb(51, 51, 51);background-color:rgb(250, 250, 250);">master</font>推送到远程。由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

从现在起,只要本地作了提交,就可以通过命令:
1
$ git push origin master
把本地 master 分支的最新修改推送至GitHub.

删除远程库

如果添加的时候地址写错了,或者就是想删除远程库,可以用

<font style="color:rgb(51, 51, 51);background-color:rgb(250, 250, 250);">git remote rm <name></font>命令。使用前,建议先用<font style="color:rgb(51, 51, 51);background-color:rgb(250, 250, 250);">git remote -v</font>查看远程库信息:

1
2
3
xw@xw:~/learngit$ git remote -v
origin	git@github.com:xiaowu003/learngit.git (fetch)
origin	git@github.com:xiaowu003/learngit.git (push)
然后,根据名字删除,比如删除 origin
1
$ git remote rm origin
此处的“删除”其实是解除了本地和远程的绑定关系,并不是物理上删除了远程库。远程库本身并没有任何改动。要真正删除远程库,需要登录到GitHub,在后台页面找到删除按钮再删除。

修改远程仓库的地址

1
2
3
git remote	//查看所有远程仓库
git remote xxx	//查看指定远程仓库地址
git remote set-url <name> <repository address>	//修改远程仓库的地址
1
2
3
git remote	//查看所有远程仓库
git remote rm <repository name>	//删除远程仓库
git  remote add <repository name> <repositary address> //添加新的远程仓库

新建本地仓库

1、如果本地电脑没有创建过ssh key,那需要先创建本地ssh key

$ ssh-keygen -t rsa -C

“your_email@youremail.com"

后面可以改成自己的邮箱,可以不用输入密码,不然后面每次提交都需要输入密码太麻烦

2、在github上关联ssh key

在ssh key的路径下找到id_rsa.pub,用记事本打开,复制里面的key。到github下,Settings>>SSH and GPG keys>>SSH keys,new一个key,粘贴id_rsa.pub的key值。 3、验证ssh key
$ ssh -T

git@github.com

第一次会提示是否continue,输入yes就会看到:You’ve successfully authenticated, but GitHub does not provide shell access 即表示已成功连上github。 4、建立本地仓库
1
2
3
4
5
git init
git add README.md
git commit -m "first commit"
git remote add <name> <prository address>
git push -u <name> <branch name>

创建空白分支

使用git checkout -b "new_branch_name"命令创建的新分支是包含父节点的,即包含了历史提交。但git checkout --orphan "new_branch_name"命令是创建孤立分支,即该命令会将原分支的内容拷贝过来,但是不包含历史提交,又因为要创建空白分支,所以使用git rm -rf .命令清除原来拷贝的内容,这样就得到了一个空白分支。

This post is licensed under CC BY 4.0 by the author.