Ένα άρθρο με μία συλλογή παραμετροποιήσεων - ρυθμίσεων για το Git, ένα λογισμικό για τη διαχείριση εκδόσεων του κώδικά μας.
Git
Συγγραφέας

stesiam

Δημοσιευμένο

4 Νοεμβρίου 2022

Εισαγωγή

Τι είναι το Version Control System

Ένα σύστημα ελέγχου εκδόσεων (Version Control System - VCS) είναι ένας εργαλείο διαχείρισης και παρακολούθησης αλλαγών στον κώδικα μας Καθώς αναπτύσσουμε μία εφαρμογή, προσθέτουμε λειτουργίες, διορθώνουμε σφάλματα με αποτέλεσμα να διορθώνουμε το κώδικά μας συνεχώς. Το VCS μας επιτρέπει να αποθηκεύουμε «στιγμιότυπα» (snapshots) σε διάφορες στάδια υλοποίσης του κώδικά μας, ώστε ανά πάσα στιγμή να δούμε τι άλλαξε, πότε και από ποιον.

Workflow without Version Control

Τα πιο γνωστά συστήματα ελέγχου εκδόσεων πηγαίου κώδικα είναι τα εξής :

  • Git
  • Apache Subversion (SVN)
  • Mercurial
  • Bazaar

Δημοφιλία VCS

Έχοντας περιγράψει τι είναι το VCS, θα ήταν χρήσιμο να μελετήσουμε ποιο ήταν το πιο γνωστό ή πιο χρησιμοποιούμενο διαχρονικά. Για να απαντήσουμε, θα ανατρέξουμε στα ιστορικά δεδομένα αναζητήσεων στη μηχανή αναζήτησης της Google και πιο συγκεκριμένα από τη πλατφόρμα Google Trends που διατηρεί δεδομένα τάσεων αναζητήσεων δημοφιλών όρων.

Show the code
avgPercentageGit = trends_vcs_tidy %>% dplyr::filter(VCS == "git: (Worldwide)") %>% pull(AVG)
avgPercentageSVN = trends_vcs_tidy %>% dplyr::filter(VCS == "svn: (Worldwide)") %>% pull(AVG)

highchart() %>%
  hc_title(text = "Τάσεις στα λογισμικά διαχείρισης εκδόσεων κώδικα (VCS)") %>%
  hc_subtitle(text = "<span style='display: inline-block; align-items: center; text-align: center;'>Σύγκριση τάσεων μεταξύ του  <img height='16' style='margin: 0px 6px;' src='https://git-scm.com/images/logos/downloads/Git-Icon-1788C.png'> Git και του <img height='16' style='margin: 0px 6px;' src='https://upload.wikimedia.org/wikipedia/commons/thumb/2/22/Apache_Subversion_logo.svg/250px-Apache_Subversion_logo.svg.png '> SVN (Subversion) από το 2004 μέχρι το 2022</span>", useHTML= TRUE) %>%
  hc_caption(
    useHTML = TRUE,
    text = '<b>Πηγή: </b> <a href="https://trends.google.com/trends/" target="_blank">Google Trends</a>') %>%
  hc_plotOptions(
    series = list(
      marker = list(
        enabled = FALSE
      )
    )
  ) %>%
 hc_annotations(list(
  labels = list(
    list(
      point = list(x = 12, y = 70, xAxis = 0, yAxis = 0),
      text = "Git",
      rotation = -30,
      backgroundColor = "rgba(255,255,255,0.7)",
      borderColor = "black",
      style = list(
        fontSize = "12px"
      )
    ),
    list(
      point = list(x = 12, y = 10, xAxis = 0, yAxis = 0),
      text = "Subversion (SVN)",
      rotation = 0,
      backgroundColor = "rgba(255,255,255,0.7)",
      borderColor = "black",
      style = list(
        fontSize = "12px"
        )
    )
  )
)) %>%
  hc_xAxis(categories = unique(trends_vcs_tidy$Year)) %>%
  hc_yAxis(title = list(text = "Τάση αναζήτησης"),
           max = 90) %>%
  hc_add_series(name = "Git", data = avgPercentageGit, type = "line", color = "orange") %>%
  hc_add_series(name = "SVN", data = avgPercentageSVN, type = "line", color = "steelblue") %>%
  hc_tooltip(shared = TRUE)

Το διάγραμμα Σχήμα 1 ξεκαθαρίζει ως κυρίαρχο εργαλείο για την διαχείριση των εκδόσεων (VCS) του κώδικά μας, το Git. Το Subversion (SVN) ήταν δημοφιλέστερο του Git μέχρι και το 2010, αλλά από τότε ακολούθησε πτωτική πορεία από την οποία δεν ανέκαμψε ποτέ. Σήμερα, το Git αποτελεί το de facto λογισμικό για τη διαχείριση του κώδικα και μαζί του κυριαρχούν πλατφόρμες που υποστηρίζουν τη φιλοξενεία κώδικα στο διαδίκτυο όπως το GitHub και το GitLab.

Πλεονεκτήματα

Για ποιο λόγο να χρησιμοποιήσω ένα τέτοιο λογισμικό;

  • Εύκολη επαναφορά: Αν μια αλλαγή δημιουργήσει πρόβλημα, μπορούμε να επιστρέψουμε σε προηγούμενη (λειτουργική) έκδοση του κώδικα με μια εντολή
  • Εξοικονόμηση χρόνου: Αντί να ψάχνουμε χειροκίνητα για να διαπιστώσω τι δεν λειτουργεί, το Git μας υποδεικνύει ακριβώς τι άλλαξε και πότε
  • Συνεργασία: Διευκολύνει τη συνεργασία με άλλους προγραμματιστές, ειδικά μέσω πλατφορμών όπως το GitHub

Αδυναμίες

Εντάξει, τα πλεονεκτήματα είναι σαφή. Υπάρχει όμως και άλλη μεριά;

  • Νέο εργαλείο: Προσθέτει ένα ακόμα βήμα στη ροή της εργασίας μας και συνεπακόλουθα τη κάνει ελαφρώς πιο πολύπλοκλη
  • Καμπύλη εκμάθησης: Χρειάζεται να αφιερωθεί σημαντικός χρόνος για τη ν εξοικείωση μας με το Git, ιδίως για προχωρημένες λειτουργίες (branching, merging, rebasing). Ωστόσο, τα βασικά μαθαίνονται γρήγορα.

Φιλοξενία κώδικα

Αναφέραμε ήδη μερικά από τα πιο σημαντικά εργαλεία ελέγχου εκδόσεων κώδικα. Αυτά, όμως, διαχειρίζονται τον κώδικα τοπικά, στην δική μας συσκευή (του χρήστη - προγραμματιστή). Αν θέλουμε να μοιραστούμε τον κώδικα μας ή να συνεργαστούμε με άλλους, είναι απαραίτητη μία υπηρεσία φιλοξενίας του κώδικα στο διαδίκτυο. Οι πιο γνωστές υπηρεσίες φιλοξενίας κώδικα είναι το GitHub, το GitLab και το Bitbucket.

Αν καμία από αυτές τις επιλογές δεν μας ικανοποιεί (π.χ. ανησυχία σχετικά με τους όρους χρήσης τους), υπάρχει και η επιλογή να φιλοξενήσουμε τον κώδικα εμείς οι ίδιοι. Εργαλεία όπως το Gitea μας δίνουν τη δυνατότητα να στήσουμε τη δική μας «πλατφόρμα» σε έναν δικό μας server. Με απλά λόγια ένα δικό μας GitHub, χωρίς εξάρτηση από τις προαναφερόμενες πλατφόρμες. Αυτή η επιλογή αν και ακούγεται καλή, στην πράξη είναι αρκετά σύνθετη και αποκόπτεσαι από τη μεγάλη πλειοψηφία των devs.

Ρυθμίσεις του Git

Αποφάσισες να χρησιμοποιήσεις το Git, ώστε να το δοκιμάσεις σε κάποια απλά project ή απλά να κρατάς αρχείο εκδόσεων για τις εργασίες σου; Είσαι σε καλό δρόμο.

Ορισμός ονόματος και email

Όταν χρησιμοποιήσεις το Git για πρώτη φορά θα σου ζητήσει να θέσεις ένα όνομα και ένα email. Χωρίς αυτά, δεν μας επιτρέπει να καταγράψουμε καμία αλλάγή. Αυτό συμβαίνει διότι κάθε «στιγμιότυπο» του κώδικά μας συνοδεύεται από τα στοιχεία αυτού που το δημιούργησε.

Φωτογραφία του Linus Torvalds το 2018

Πηγή φωτογραφίας: Wikimedia Commons, 2021 - Άδεια χρήσης: CC BY 3.0. Για τη πρωτότυπη φωτογραφία μπορείτε να πατήσετε τον σύνδεσμο

Terminal
git config --global user.name "YourName"
git config --global user.email your_email
Σημείωση

Αν σχεδιάζεις να φιλοξενήσεις τον κώδικά σου στο GitHub, ίσως να έχει νόημα να κρύψεις τη προσωπική σου διεύθυνση email. Σε αυτήν την περίπτωση, το GitHub προσφέρει ένα noreply email προκειμένου να μην την εκτίθεται η πραγματική σου διεύθυνση στο διαδίκτυο. Αν επιθυμείτε, μπορείτε να διαβάσετε περισσότερα για αυτό το θέμα στον ακόλουθο σύνδεσμο.

Πρόγραμμα επεξεργασίας

Όταν γράφουμε μηνύματα commit (μήνυμα που εξηγεί τι είδους αλλαγές κάναμε), το Git ανοίγει ένα πρόγραμμα επεξεργασίας κειμένου. Σε πολλά συστήματα (π.χ. Ubuntu) η προεπιλογή είναι το Vim. Ο τελευταίος είναι αρκετά αξιόλογος editor, αλλά με απότομη καμπύλη εκμάθησης. Αν δεν είμαστε εξοικειωμένοι με τον προεπιλγμένο editor μπορούμε να τον αλλάξουμε σε κάποιον που μας είναι πιο γνώριμος.

Terminal
git config --global core.editor "editor_name"
Editor Command
Visual Studio Code git config --global core.editor "code --wait"
Atom git config --global core.editor "atom --wait"
Nano git config --global core.editor "nano"

Το Visual Studio Code είναι σήμερα ο πιο δημοφιλής editor σύμφωνα με την έρευνα προγραμματιστών του Stack Overflow, οπότε αποτελεί μία ασφαλή επιλογή αν δεν έχεις ιδιαίτερη προτίμηση.

Προεπιλεγμένο όνομα κλαδου (branch)

Τον Οκτώβριο του 2020, το GitHub ανακοίνωσε ότι αλλάζει το προεπιλεγμένο όνομα του αρχικού κλάδου (branch) από master σε main.

The default branch name for new repositories is now main.
GitHub.blog - October 1,2020

Καλό είναι να κάνουμε την ίδια αλλαγή και τοπικά, ώστε να υπάρχει συνέπεια:

Terminal
git config --global init.defaultBranch main

Μέθοδος συγχώνευσης (merge)

One change that is not exactly necessary but helps me is to change the defaults regarding merge. Let’s say that I want to add a new feature in my application. Most of the times I will make a branch on which I will start developing my new feature. When I implement this function and I’m ready to merge my changes into the main code there are two situations.

1. There are commits to main branch

The predefined action is to merge. The branch is visible. Our setting has not any effect on this case.

2. There are no commits to main branch

The predefined action of Git is to take the feature branch and paste it on the top of main branch. By making the setting above I am telling Git to keep the branch and react like the first case. The branch is visible again.

With simple words, I am forcing Git to keep branch, regardless of changes to main branch.

Terminal
git config --global merge.ff false

Auto-sign your commits

In a previous article we saw how to sign our commits as well as the reasons for doing so. In short, we made a PGP key which we added to our GitHub account. From that moment to sign my commits I had to write git commit -S -m "something", instead of git commit -m "something". Of course, that method is a little bit problematic. It is a little bit longer, little different in comparison to what I am used to type and most importantly I may forget some times to sign it manually. The last one happened to me A LOT. Thankfully, there is a way to be carefree about that anymore. I can set git config in a way that my commits will be signed automatically.

Προειδοποίηση

If you do not have already a GPG key, you can have a look in this guide in order to generate one. Also, depending your hosting platform for your code, you can link your GPG with your account :

Terminal
gpg --list-secret-keys --keyid-format LONG
git config user.signingkey key_id
git config commit.gpgsign true

Ελέγχοντας τις ρυθμίσεις του Git

Making the above settings, we can have a summary of those with the corresponding command:

Terminal
git config --list

Here is the output on my machine :

Output of git-config command

The image above sums up the settings of Git. Although, each user has different needs and for that reason it would be good in case you want to learn more about git config to see their documentation page.

Συνοψίζοντας

Μία σύνοψη των εντολών που χρησιμοποιήσαμε για τη ρύθμιση του Git.

Terminal
git config --global user.name "YourName"
git config --global user.email your_email
git config --global core.editor "editor_name"
git config --global init.defaultBranch main
git config --global merge.ff false

# Add PGP key to your commits

gpg --list-secret-keys --keyid-format LONG
git config user.signingkey key_id
git config commit.gpgsign true

# check git config settings

git config --list --show-origin

Of course you can access your git config file on your Home directory (at least on Ubuntu installation).

Προειδοποίηση

Note that the .gitconfig file, which contains our settings, may not be visible in the Home directory. In general, files whose names begin with a period are not displayed. However, if everything has been done correctly, it’s probably there. For example, in Ubuntu you should choose to show hidden files.

Ευχαριστίες

Φωτογραφία από Daniel Skovran από το Pixabay

Αναφορές

Chacon, S., & Straub, B. (2014). Pro git. Springer Nature.

Αναφορά

Αναφορά BibTeX:
@online{2022,
  author = {, stesiam},
  title = {Παραμετροποίηση του Git},
  date = {2022-11-04},
  url = {https://stesiam.com/el/posts/git-commands/},
  langid = {el}
}
Για απόδοση ευγνωμοσύνης, παρακαλούμε αναφερθείτε σε αυτό το έργο ως:
stesiam. (2022, November 4). Παραμετροποίηση του Git. Retrieved from https://stesiam.com/el/posts/git-commands/