Unix 常見指令
(下面的file是指 文件名+后綴 的)
s –l 列出當前目錄下的所有內容(文件\文件夾)
pwd 顯示出當前目錄的名稱
cd 改變當前操作的目錄
who 顯示當前用戶名
clear 清屏
mkdir dir_name 新建一個目錄
touch file 新建一個文件(文件不存在才會新建)
open file/dir_name 打開一個文件\文件夾
按一下tab鍵,可以自動補齊指令名稱、文件名、文件夾名等
ls -ah 查看隱藏的文件
rm file 刪除文件
Git命令
具體參考 git教程 - 廖雪峰的官方網站
對于版本倉庫,跟蹤的文件的改動,而不是文件的內容。
git的命令是區分大小寫的。
—— 創建git倉庫
- git init 初始化git倉庫
—— 把文件添加進git進行管理
添加一個文件,兩個步驟
- 1、git add 文件名.后綴
- 2、git commit -m"要添加的備注內容"
(問題:忘記 -m后命令行彈出來的那些東西怎么弄)
—— 怎么通過提交記錄查看是否提交成功
怎么看當前的提交是否提交到了git?有提交就有記錄,通過查看記錄
- git log
會顯示的時間個當初提交的備注
### —— 查看詳細的Log信息
* git log --pretty=oneline
amqrMBP:learngit amqr$ git log --pretty=oneline
e15c6063a6c70728fcedf1b466e355a39cfb9242 the add under the GPL
21f61335c295f9074cccec86cb2c0554b997700d allow add
1c50901d96e3db42f4f91c68da02f630a8b62b29 first commit readme
比如這樣這一串 e15c6063a6c70728fcedf1b466e355a39cfb9242 是提交的版本號(id)
—— 查看git的狀態
- git status
如果顯示 “nothing to commit, working directory clean”那么就代表是正常的,無任何沖突的
是修改過,還是正常,還是沖突等
—— 查看文件被修改的內容與之前的區別
- git diff
—— 版本回退
- git reset --hard^
- git reset --hard^^
- git reset --hard~3
在Git中,用HEAD表示當前版本。
git reset --hard^ 表示往上回退一個版本
git reset --hard^^ 表示往上回退兩個版本
git reset --hard 1c50901 表示回退到指定版本
這個1c50901就是 git log --pretty=oneline 命令得到的那些版本的前面的一長串數字的前面幾個數字,我們取一定的位數足以代表就可以了。
amqrMBP:learngit amqr$ git log --pretty=oneline
e15c6063a6c70728fcedf1b466e355a39cfb9242 the add under the GPL
21f61335c295f9074cccec86cb2c0554b997700d allow add
1c50901d96e3db42f4f91c68da02f630a8b62b29 first commit readme
amqrMBP:learngit amqr$ git reset --hard HEAD^
HEAD is now at 21f6133 allow add
amqrMBP:learngit amqr$ git log --pretty=oneline
21f61335c295f9074cccec86cb2c0554b997700d allow add
1c50901d96e3db42f4f91c68da02f630a8b62b29 first commit readme
amqrMBP:learngit amqr$
—— 查看版本提交和回退的總的記錄
- git reflog
amqrMBP:learngit amqr$ git reflog
21f6133 HEAD@{0}: reset: moving to HEAD^
e15c606 HEAD@{1}: commit: the add under the GPL
21f6133 HEAD@{2}: commit: allow add
1c50901 HEAD@{3}: commit (initial): first commit readme
—— 回退后還怎么跳轉到新的版本
amqrMBP:learngit amqr$ git reflog
21f6133 HEAD@{0}: reset: moving to HEAD^
e15c606 HEAD@{1}: commit: the add under the GPL
21f6133 HEAD@{2}: commit: allow add
1c50901 HEAD@{3}: commit (initial): first commit readme
amqrMBP:learngit amqr$ git reset --hard e15c606
HEAD is now at e15c606 the add under the GPL
======= 以上算是小小地說了一下增刪改查,接下說一下暫存區的概念 =====
Git的版本庫里存了很多東西,
其中最重要的就是稱為stage(或者叫index)的暫存區
還有Git為我們自動創建的第一個分支master,以及指向master的一個指針叫HEAD。
我們把文件往Git版本庫里添加的時候,是分兩步執行的:
第一步是用git add把文件添加進去,實際上就是把文件修改添加到暫存區;
第二步是用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支。
因為我們創建Git版本庫時,Git自動為我們創建了唯一一個master分支,所以,現在,git commit就是往master分支上提交更改。
你可以簡單理解為,
需要提交的文件修改通通放到暫存區,然后,一次性提交暫存區的所有修改。
—— 查看工作區和版本庫的不同
- git diff HEAD -- 文件名.后綴
每次修改,如果不add到暫存區,那就不會加入到commit中。
—— 撤銷add到工作區的內容(只add到了工作區,還沒有commit到branch)
方法一:
git checkout -- file 比如 git checkout -- readme.txt
就可以把你剛剛add到暫存區的所修改的內容撤銷掉,也可以相當于恢復到之前最新的commit的狀態
git checkout -- file命令中的--很重要,沒有--,就變成了“切換到另一個分支”的命令 , 以后會涉及到的。
方法二:
- git reset HEAD file 可以把暫存區的修改撤銷掉(unstage),重新放回工作區
比如 git reset HEAD readme.txt
—— 已經把錯誤的內容add并且commit到了分支了,還可以補救嗎?可以,前提是還沒有推送到遠程庫。
使用 git reset 補救(前提是還沒有推送到遠程庫)。
—— 刪除提交到版本庫的branch的文件(這這是刪除版本庫的,本地的還在,想刪除本地的文件的話還需要自己刪除)
- git rm file
比如 git rm test.txt
—— 本地誤刪了一個文件,從版本拿到那個文件恢復過來到本地(前提是之前這個文件已經提交到版本庫)
- git checkout -- ?file
比如 git checkout -- test.txt
git checkout其實是用版本庫里的版本替換工作區的版本,無論工作區是修改還是刪除,都可以還原。
========= 接下來是建立遠程倉庫(和github結合) ==============
建立遠程倉庫(和github結合)
現在已經在本地創建了一個Git倉庫后,又想在GitHub創建一個Git倉庫,并且讓這兩個倉庫進行遠程同步,這樣,GitHub上的倉庫既可以作為備份,又可以讓其他人通過該倉庫來協作
首先電腦得有git這個不用說了,我們上面都可以用了肯定有git。
前提準備:
- git
- github的賬號
接下里,就是需要 配 .ssh
配好 .ssh之后就可以把綁定到github了
配 .ssh 和 綁定github 請看這里
綁定好之后,我們要知道一件事,把我們的倉庫推到github有兩種是
- 一種是通過 https
- 一種是通過 ssh
我們上面的把ssh綁定到github就是為了通過ssh的方式把倉庫推到github
這里說明一點,按照廖雪峰的方式以ssh的方式push,推送失敗,但是只要在
The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?
這個地方寫上 yes
就可以順利地推到github了。
對于以前已經弄過了ssh,怎么查看當初填寫的郵箱名?
打開 .ssh文件夾的 id_rsa.pub ,在文本的最后面就可看到 郵箱名字。
Git的倉庫克隆
git clone 后面加遠倉庫的https或者ssh鏈接
類似于下面這樣子:
$ git clone git@github.com:michaelliao/gitskills.git
Cloning into 'gitskills'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
$ cd gitskills
$ ls
README.md
分支管理
查看分支:git branch
創建分支:git branch <name>
切換分支:git checkout <name>
創建+切換分支:git checkout -b <name>
合并某分支到當前分支:git merge <name>
刪除分支:git branch -d <name>
查看沖突合并情況
合并時出現沖突
$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
查看沖突的原因:
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
# Unmerged paths:
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# both modified: readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
解決沖突后 查看沖突合并情況
- git log --graph
$ git log --graph --pretty=oneline --abbrev-commit
* 59bc1cb conflict fixed
|\\
| * 75a857c AND simple
* | 400b400 & simple
|/
* fec145a branch test
...
--no-ff的方式merge (保留歷史)
儲存工作和和恢復工作區
- git stash 儲存工作區
- git stash list 查看儲存的工作區列表
$ git stash list
stash@{0}: WIP on dev: 6224937 add merge
** 恢復兩個辦法:**
方法一:是用git stash apply恢復,但是恢復后,stash內容并不刪除,然后你需要用git stash drop來刪除;
- git stash apply
- git stash drop
方法二:另一種方式是用git stash pop,恢復的同時把stash內容也刪了:
- git stash pop
$ git stash list
stash@{0}: WIP on dev: 6224937 add merge
強行刪除還沒合并的分支
- git branch -D ?分支名
多人開發
查看遠程庫信息,使用git remote -v;
本地新建的分支如果不推送到遠程,對其他人就是不可見的;
從本地推送分支,使用git push origin branch-name,如果推送失敗,先用git pull抓取遠程的新提交;
在本地創建和遠程分支對應的分支,使用git checkout -b branch-name origin/branch-name,本地和遠程分支的名稱最好一致;
建立本地分支和遠程分支的關聯,使用git branch --set-upstream branch-name origin/branch-name;
從遠程抓取分支,使用git pull,如果有沖突,要先處理沖突。
給分支打上標簽
命令git tag <name>用于新建一個標簽,默認為HEAD,也可以指定一個commit id;
git tag -a <tagname> -m "blablabla..."可以指定標簽信息;
git tag -s <tagname> -m "blablabla..."可以用PGP簽名標簽;
命令git tag可以查看所有標簽。
命令git push origin <tagname>可以推送一個本地標簽;
命令git push origin --tags可以推送全部未推送過的本地標簽;
命令git tag -d <tagname>可以刪除一個本地標簽;
命令git push origin :refs/tags/<tagname>可以刪除一個遠程標簽。